https://codechacha.com/ko/android-get-location-from-gms/
Android - FusedLocationProviderClient으로 위치 정보 얻기
Google Play Service에서 제공하는 Location 라이브러리로 위치 정보를 가져올 수 있습니다. 간단한 샘플 코드를 소개합니다. 또한, Android Developer에서 제공하는 문서들을 보시면 더 자세한 사용 방법을
codechacha.com
의존성 설정
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);
'안드로이드' 카테고리의 다른 글
[Android Studio] 어댑터에서 콜백 리스너 사용하기 (0) | 2022.11.19 |
---|---|
[Android Studio] Glide 사용시 모서리 둥글게 처리하기 (0) | 2022.10.28 |
[Android] Android Studio 이미지 흔들리는 애니메이션 효과 적용! (2) | 2022.10.14 |
[Android / Kotlin ] ViewPager2 로 달력만들기 2편 (0) | 2022.04.27 |
[ Android/ Kotlin ] xml RSS Feed 파싱하기 1편 (0) | 2022.04.27 |