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() 호출을 통해 사용자에게 위치 설정을 수정할 수 있는 권한을 요청하는 대화상자를 표시합니다.)