[android wearOS] 현재 위치 좌표값 얻기(FusedLocationProviderClient)

dh·2022년 7월 30일

국토교통부(TAGO)버스정류소정보 API는 바로 승인이 됐는데 인천버스도착정보API 승인이 나지 않은 상태였다.
그리고 안드로이드 레이아웃, 위젯 사용법도 잘 몰라서 우선 TAGO API를 사용하여 주변 정류소 정보를 얻어오는 테스트를 하기로 했다.
그러기 위해서 현재 위치의 좌표가 필요했다.

안드로이드에서 위치정보를 얻는 방법은 LocationManager와 FusedLocationProvider가 있다. FusedLocationProvider가 배터리 효율도 좋고 android 공식 사이트에서 사용을 권장하고 있다고 해서 FusedLocationProvider를 사용하기로 했다.

dependencies에 play service 추가하기

build.gradle(Module)에 다음을 추가한다.
implementation 'com.google.android.gms:play-services-location:20.0.0'

권한 추가하기

Androidmanifest.xml 파일에 다음 추가
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

코드

 private FusedLocationProviderClient mFusedLocationClient;
 private LocationRequest locationRequest;
 private int locationRequestCode = 1000;
 private double wayLatitude = 0.0, wayLongitude = 0.0;
 private boolean isContinue = false;
 public static final int DEFAULT_LOCATION_REQUEST_PRIORITY = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY;
 public static final long DEFAULT_LOCATION_REQUEST_INTERVAL = 20000L;      //20초 사이
 public static final long DEFAULT_LOCATION_REQUEST_FAST_INTERVAL = 10000L; //10초에서

 mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); //위치 정보를 제공하는 클라이언트 객체

 private void getLocation() {
        locationRequest = LocationRequest.create(); //location에 필요한 정보를 정의 하는 Request객체 생성
        locationRequest.setPriority(DEFAULT_LOCATION_REQUEST_PRIORITY);//위치 정밀도 설정
        locationRequest.setInterval(DEFAULT_LOCATION_REQUEST_INTERVAL);//위치 업데이트 시간 간격을 밀리초 단위로 설정
        locationRequest.setFastestInterval(DEFAULT_LOCATION_REQUEST_FAST_INTERVAL);
        //앱에 위치 권한이 있는 없는 경우
        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
                    locationRequestCode);//위치권한 요청

        } else {    //이미 앱에 위치 권한이 있는 경우
            if (isContinue) {
                mFusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null); //Request객체를 전달하고 그 결과를 콜백함수에서 전달 받는다 
            } else {
                mFusedLocationClient.getLastLocation().addOnSuccessListener(MainActivity.this, location -> {
                    if (location != null) {
                        wayLatitude = location.getLatitude();
                        wayLongitude = location.getLongitude();
                    } else {
                        mFusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null);
                    }
                });
            }
        }
    }

위치권한이 없으면 오버라이드된 onRequestPermissionResult에서 요청한 권한의 결과를 얻는다.

@Override
    //requestPermissions에서 요청한 권한의 결과를 받는다.
    //requestPermissions에서 requestCode를 전달해 연결한다.
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1000: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    if (isContinue) {
                        mFusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null);
                    } else {
                        mFusedLocationClient.getLastLocation().addOnSuccessListener(MainActivity.this, location -> {
                            if (location != null) {
                                wayLatitude = location.getLatitude();
                                wayLongitude = location.getLongitude();
                                txtLocation.setText(String.format("%s - %s", wayLatitude, wayLongitude));
                            } else {
                                mFusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null);
                            }
                        });
                    }
                } else {
                    Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
                }
                break;
            }
        }
    }

위치 업데이트

  private LocationCallback locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(@NonNull LocationResult locationResult) {
            super.onLocationResult(locationResult);
            wayLongitude = locationResult.getLastLocation().getLongitude();
            wayLatitude = locationResult.getLastLocation().getLatitude();
            mFusedLocationClient.removeLocationUpdates(locationCallback); //결과 전달 되면 리스너 삭제
        }
    };

Reference
https://droidbyme.medium.com/get-current-location-using-fusedlocationproviderclient-in-android-cb7ebf5ab88e
https://manorgass.tistory.com/82
https://codechacha.com/ko/android-get-location-from-gms/

0개의 댓글