일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 안드로이드
- RxJava
- Java
- Android
- 안드로이드 구글맵
- Flutter TextField
- 알고리즘
- livedata
- UWP
- Kotlin
- RxAndroid
- kodility
- Python
- Rxjava2
- NDK
- C
- Android P
- 프로그래머스
- C/C++
- C++
- Django REST framework
- Django REST
- FLUTTER
- android architecture component
- android push
- dart
- 코틀린
- Django REST Android
- flutter firestore
- mfc
- Today
- Total
개발하는 두더지
[Android/Kotlin] FusedLocationProvider를 이용한 기기의 현재위치 가져오기 본문
간단하고, 배터리 효율적인 위치 API
앱은 기기의 여러 센서가 제공하는 신호를 활용하여 기기 위치를 파악할 수 있습니다. 그러나 여러 환경에서 적합한 신호 조합을 선택하는 것은 쉽지 않습니다. 배터리 효율적인 방법을 찾는 것 또한 복잡합니다. FusedLocationProvider 는 위치 정보를 제공하기 위해 여러 신호를 지능적으로 조합하는 Google Play Service에서 제공하는 위치 API 입니다.
코드로 살펴보겠습니다.
build.gradle 에 구글 플레이 서비스에서 제공하는 API를 주입시켜줍니다.
// google map api & location
implementation 'com.google.android.gms:play-services-maps:16.0.0'
implementation 'com.google.android.gms:play-services-location:16.0.0'
AndroidManifest.xml에 다음의 퍼미션을 추가해줍니다.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Sync Projects를 완료하고나면 원하는 곳에 위치 API를 사용할 수 있습니다.
MainActivity 에 현재 위치를 가져오는 방법입니다. checkSelfPermission을 통해 ACCESS_FINE_LOCATION과 ACCESS_COARSE_LOCATION 권한이 있는지 런타임에 확인해주고 권한이 있으면 위치 서비스에 연결시켜주고 lastLocation을 통해 현재위치를 가져올 수 있습니다.
private fun initLocation() {
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return
}
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
fusedLocationClient.lastLocation
.addOnSuccessListener { location ->
if(location == null) {
Log.e(TAG, "location get fail")
} else {
Log.d(TAG, "${location.latitude} , ${location.longitude}")
}
}
.addOnFailureListener {
Log.e(TAG, "location error is ${it.message}")
it.printStackTrace()
}
}
location이 null이 올 수 있는 상황이 있습니다
기기 설정에서 위치를 비활성화 시키면 결과는 null이 나올 수 있습니다. 위치를 비활성화하면 캐시까지 지워지기 때문에 이전에 얻은 마지막 위치일지라도 구할 수 없게됩니다.
위치 권한을 한번 비활성화 시키고 다시 활성화시켜도 앱에서 바로 위치정보를 가져올 수 없습니다. 그래서 위치 업데이트를 요청을 해야 합니다.
locationRequest = LocationRequest.create()
locationRequest.run {
priority = LocationRequest.PRIORITY_HIGH_ACCURACY
interval = 60 * 1000
}
locationCallback = object: LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
locationResult?.let {
for((i, location) in it.locations.withIndex()) {
Log.d(TAG, "#$i ${location.latitude} , ${location.longitude}")
}
}
}
}
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper())
override fun onPause() {
super.onPause()
fusedLocationClient.removeLocationUpdates(locationCallback)
}
'Kotlin' 카테고리의 다른 글
[Kotlin]coroutine, firestore java.lang.IllegalStateException: Already resumed, but proposed with update 에러 처리 (0) | 2019.03.05 |
---|---|
[Android/Kotlin] aac + Viewmodel + LiveData + Room을 사용하여 Todo 리스트 만들기 (1) | 2018.12.13 |
[Android/Kotlin] Realm+RecyclerView를 이용한 간단한 Todo 앱 만들기 (0) | 2018.12.13 |
Kotlin 다양한 For 사용 (0) | 2018.10.18 |