오늘은 Android의 location API중 유저의 마지막 위치를 알려주는 getLastLocation API와 주의할 점에 대해서 정리해 보도록 하겠습니다.

 

참고로 이 API를 이용하기 위해서는 위치권한을 동적으로 얻어야 하는데요.

위치권한관련해서 예전 Java시절의 권한얻는 글은 아래 링크를 참조해주시구요.

추후에 Kotlin으로 작성된 최근방식도 업데이트하도록 하겠습니다.

>> Android 에서 동적 권한 얻기 #골치아픈 # Runtime Permission

1. getLastLocation

앱에서 위치정보를 필요로 할 때가 있는데요.

위치정보를 계속 실시간으로 업데이트 할 것이 아니라, 유저가 요청할 때 그때의 최신 위치를 기준으로 정보를 UI로 표현해주어야 할 때가 있는데요. 이 때 유용한 API가 바로 getLastLocation()입니다.

사용방법도 매우 간단합니다.

먼저 아래와 같이, onCreate에서 mFusedLocationClient를 생성해서 변수에 담아 줍니다.

 

private lateinit var mFusedLocationClient: FusedLocationProviderClient

override fun onCreate(savedInstanceState: Bundle?) {
    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
}

 

 

그리고, mFusedLocationClient에 lastLocation.addOnSuccessListener콜백을 호출해주기만 하면 됩니다.

location을 받아와서 LatLng으로 전환해 사용하면 그만입니다.

심플하고 사용하기도 너무 좋지요.

 

mFusedLocationClient.lastLocation
        .addOnSuccessListener { location : Location? ->
			val mLatLng = LatLng(location.latitude, location.longitude)
        }

 

 

2. getLastLocation에는 Null이 들어올 수 있다.

getLastLocation에 addOnSuccessListener를 사용하다 보면, 왜 공식문서를 꼼꼼히 읽어보아야 하는지 느끼게 됩니다.

문서를 읽어보면 null이 나오는 경우는 흔치않을 것만 같은데요.

(어쩌면 귀찮으니 그냥 써도 된다고 이해하자는 마음때문에 그렇게 보이는지도 모르겠습니다.)

 

그러나, 실제로는 폰에 따라서, null이 나오는 경우가 종종 있다는 것 입니다.

위의 Lambda식에서도 보이시겠지만, 분명 "Location?"타입으로 나와있습니다.

 

 

그런데, 그럴수 있다고만 하고 대책은 알려주지 않고 공식문서는 끝납니다.

 

3. requestLocationUpdates

대안으로는  아래와 같이 requestLocationUpdates를 실행하고, 바로 removeLocationUpdates를 하는 식으로 대응할 수 있습니다.

 

if (location != null){
	mLatLng = LatLng(location.latitude, location.longitude)
else {
    val mRequest = LocationRequest.create()
                  .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                  .setInterval(300)
                  .setFastestInterval(200)
    val mLocationCallback = object : LocationCallback() {
    override fun onLocationResult(locationResult: LocationResult?) {
                locationResult ?: return
                for (location in locationResult.locations) {
                    mLatLng = LatLng(location.latitude, location.longitude)
				mFusedLocationClient.removeLocationUpdates(this)
            }
        }
    }
    mFusedLocationClient.requestLocationUpdates(request, mLocationCallback, null)
}

 

 

이상으로 유저의 현재 위치를 얻어오는 getLastLocation() API에 대해서 정리해 보았습니다.

더 좋은 방법이 있다면 이 글에서 업데이트하도록 하겠습니다.

 

728x90

+ Recent posts