GMS Location 라이브러리에 대해

최희창·2022년 5월 26일

GMS Location 라이브러리

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

의존성 설정

dependencies {
    ...
    implementation 'com.google.android.gms:play-services-location:17.1.0'
}
  • GMS의 location 라이브러리를 사용하기 위해서는 위와 같이 의존성 설정을 해야 한다.

Location 퍼미션 설정

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  • 위치 정보를 얻기 위해 AndroidManifest에 퍼미션 등록을 해야 합니다.
  • ACCESS_COARSE_LOCATION : 도시 Block 단위의 정밀도의 위치 정보를 얻을 수 있습니다.
  • ACCESS_FINE_LOCATION : 위 권한보다 더 정밀한 위치 정보를 얻을 수 있습니다.

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

private val fusedLocationClient = LocationServices.getFusedLocationProviderClient(context)
  • 우선 FusedLocationProviderClient 객체를 받아와야 합니다.
fusedLocationClient.lastLocation
     .addOnSuccessListener { location: Location? ->
        location?.also {
             setLocationData(it)
             }
         }
  • FusedLocationProviderClient에서 마지막에 저장된 위치 정보를 가져올 수 있습니다.
  • LocationService는 위치 정보를 캐시하며, lastLocation.addOnSuccessListener()으로 마지막에 캐시된 위치 정보를 가져옵니다.

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

  • 위치 정보가 업데이트될 때 마다 이벤트를 받을 수 있습니다.
  • 업데이트 Interval 등의 옵션이 저장된 LocationRequest와 LocationCallback을 생성하고 requestLocationUpdates()으로 변경사항에 대한 Callback을 요청할 수 있습니다.
    @SuppressLint("MissingPermission")
    private fun startLocationUpdates() {
        fusedLocationClient.requestLocationUpdates(
            locationRequest,
            locationCallback,
            null
        )
    }

    companion object {
        val locationRequest: LocationRequest = LocationRequest.create().apply {
            interval = 10000
            fastestInterval = 5000
            priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        }

        val locationCallback = object : LocationCallback() {
            override fun onLocationResult(locationResult: LocationResult?) {
                locationResult ?: return
                for (location in locationResult.locations) {
                    setLocationData(location)
                }
            }
        }
    }

Callback 등록 해제

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

현재 위치 설정 받기

  • Google Play 서비스 및 위치 서비스 API에 연결하면 사용자 기기의 현재 위치 설정을 받을 수 있습니다.
private val settingsClient: SettingsClient = LocationServices.getSettingsClient(context)
private val locationSettingsRequest: LocationSettingsRequest?
val builder = LocationSettingsRequest.Builder()
     .addLocationRequest(LocationLiveData.locationRequest)
locationSettingsRequest = builder.build()
builder.setAlwaysShow(true)
  • LocationSettingRequest.Builder를 만들고 하나 이상의 위치 요청을 추가해줍니다.
    fun turnGPSOn(onGpsListener: OnGpsListener?) {
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            onGpsListener?.gpsStatus(true)
        } else {
            settingsClient
                .checkLocationSettings(locationSettingsRequest)
                .addOnSuccessListener {
                    onGpsListener?.gpsStatus(true)
                }
                .addOnFailureListener { exception ->
                    if (exception is ResolvableApiException) {
                        try {
                            exception.startResolutionForResult(
                                context as Activity,
                                REQUEST_CHECK_SETTINGS
                            )

                        } catch (sendEx: IntentSender.SendIntentException) {

                        }
                    }
                }
        }
    }
  • checkLocationSettings의 Task가 완료되면 LocationSettingsResponse 객체의 상태 코드로 위치 설정을 확인할 수 있습니다.
  • 위치 설정이 위치 요청에 적합한지 확인을 하기 위해서는 OnFailure() 메서드에 전달된 ResolvableApiException 객체로 확인할 수 있습니다.
    (startResolutionForResult() 호출을 통해 사용자에게 위치 설정을 수정할 수 있는 권한을 요청하는 대화상자를 표시합니다.)
profile
heec.choi

0개의 댓글