Android - FusedLocationProviderClient으로 위치 정보 얻기

JS · 24 Dec 2020

Google Play Service에서 제공하는 Location 라이브러리로 위치 정보를 가져올 수 있습니다.

이 글에서는 간단한 샘플 코드를 소개합니다.

Android Developer에서 제공하는 문서들을 보시면 더 자세한 사용 방법을 얻을 수 있습니다.

Android Framework의 LocationManager를 이용해서 위치 정보를 가져올 수도 있습니다.

의존성 설정

App의 build.gradle의 dependencies에 다음과 같이 play-services-location를 추가하면 Location 라이브러리를 사용할 수 있습니다.

dependencies {
    ...
    implementation 'com.google.android.gms:play-services-location:17.1.0'
}

Location 퍼미션

위치 정보를 얻으려면 다음 퍼미션 중 하나는 AndroidManifest에 정의해야 합니다.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  • ACCESS_COARSE_LOCATION : 도시 Block 단위의 정밀도의 위치 정보를 얻을 수 있습니다.
  • ACCESS_FINE_LOCATION : ACCESS_COARSE_LOCATION보다 더 정밀한 위치 정보를 얻을 수 있습니다.

Runtime Permission 요청에 대한 자세한 구현은 Android - Runtime permission 요청 방법을 참고해주세요.

마지막으로 확인된 위치 정보 얻기

FusedLocationProviderClient 객체는 다음과 같이 얻을 수 있습니다.

val fusedLocationClient: FusedLocationProviderClient!
        = LocationServices.getFusedLocationProviderClient(this)

FusedLocationProviderClient에서 마지막에 저장된 위치 정보를 가져올 수 있습니다.

fusedLocationClient.lastLocation.addOnSuccessListener { location : Location? ->
    if (location != null) {
        val latitude = location.latitude
        val longitude = location.longitude
        Log.d("Test", "GPS Location Latitude: $latitude" +
                ", Longitude: $longitude")
    }
}

LocationService는 위치 정보를 캐시하며, lastLocation.addOnSuccessListener()으로 마지막에 캐시된 위치 정보를 가져옵니다.

다음과 같은 경우에 null이 리턴될 수 있습니다.

  • 디바이스의 Location 사용이 중지되는 경우 캐시 정보가 삭제되기 때문에 null이 리턴될 수 있습니다.
  • 위치 정보를 얻은 적이 없을 때 null이 리턴될 수 있습니다.
  • Google Play 서비스가 재실행되었을 때, 저장된 위치 정보가 없기 때문에 null이 리턴될 수 있습니다.

위치 정보 변경에 대한 이벤트 받기

다음과 같이 위치 정보가 업데이트될 때마다 이벤트를 받을 수 있습니다. 먼저 업데이트 Interval 등의 옵션이 저장된 LocationRequest와 LocationCallback을 생성하고 requestLocationUpdates()으로 변경사항에 대한 Callback을 요청할 수 있습니다.

val locationRequest = LocationRequest.create()
locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
locationRequest.interval = 20 * 1000
fusedLocationClient.requestLocationUpdates(locationRequest,
    locationCallback,
    Looper.getMainLooper());


val locationCallback = object : LocationCallback() {
    override fun onLocationResult(locationResult: LocationResult) {
        if (locationResult == null) {
            return
        }
        for (location in locationResult.locations) {
            if (location != null) {
                val latitude = location.latitude
                val longitude = location.longitude
                Log.d("Test", "GPS Location changed, Latitude: $latitude" +
                        ", Longitude: $longitude")
            }
        }
    }
}

Callback 등록 해제

더 이상 위치 정보를 받을 필요가 없다면 다음과 같이 서비스에 등록된 Callback을 해제할 수 있습니다.

fusedLocationClient.removeLocationUpdates(locationCallback);

참고

댓글을 보거나 쓰려면 이 버튼을 눌러주세요.
codechachaCopyright ©2019 codechacha