상세 컨텐츠

본문 제목

Android GPS Tutorial

안드로이드/basic

by 개발혱 2021. 2. 20. 19:40

본문

Android GPS

  • Google Play  서비스 Location API를 사용하여 앱에서 마지막으로 알려진 사용자 기기의 위치를 요청할 수 있습니다. 대부분의 경우 사용자의 현재 위치에 관심이 있고 사용자의 현재 위치는 일반적으로 마지막으로 알려진 기기의 위치와 같습니다.
  • 통합 위치 정보 제공자는 Google Play 서비스의 Location API중 하나입니다. 기본 위치 기술을 관리하고 단순한 API를 제공하므로, 높은 수준으로 요구사항(높은 정확성이나 저전력 등)을 지정할 수 있습니다.

GPS 사용 순서

  • 앱의 위치 정보 접근 권한 부여
  • 안드로이드 기기의 위치 서비스 활성화
  • 위치 서비스를 사용하여 현재 위치 획득

AndroidManifest.xml

<!--GPS정보를 이용해서 정확한 정보를 얻어 오기 위한 정보(정확한 정보 얻기 용이, gps사용하는 동안 전력소모 크다, 지하에 있거나 실내에 있을 경우 안 잡히거나 오차범위가 클 수 있다. Network_Provider와 GPS_PROVIDER 모두 사용하는 경우 --> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<!--모바일 기지국을 이용해서 데이터 가져오는 것. 실내, 지하에 상관없이 어느 정도 위치를 파악 가능.--> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

백그라운드 위치(항상 허용)

  • 앱 내 기능이 지속적으로 다른 사용자와 위치를 공유

런타임 시 위치 정보 액세스 권한 요청(앱 사용중에만 허용)

  • 앱이 켜져 있을 때만 사용 가능.

권한 확인 API

  • 위치 요청 설정
    • 업데이트간격-setInterval()
    • 가장 빠른 업데이트 간격-setFastestInteval()
    • 우선순위
      • PRIORITY_BALANCED_POWER_ACCURACY
        • 저전력, Wi-Fi와 휴대폰 기지국 위치를 사용
      • PRIORITY_HIGH_ACCURACY
        • 가장 정확한 위치를 요청, GPS를 사용하여 위치를 확인할 가능성(자전거 트레킹과 같이 정확한 트레킹이 필요할 때)
      • PRIORITY_LOW_POWER
        • 도시 수준의 정밀도를 요청, 10킬로미터의 정확성, 전력 더 적게 소비 가능
      • PRIORITY_NO_POWER
        • 위치 업데이트를 수신하려면 이 설정을 사용
fun createLocationRequest() {
    val locationRequest = LocationRequest.create()?.apply {
        interval = 10000
        fastestInterval = 5000
        priority = LocationRequest.PRIORITY_HIGH_ACCURACY
    }
}
  • 현재 위치 설정 받기
val builder = LocationSettingsRequest.Builder()
        .addLocationRequest(locationRequest)

// ...

val client: SettingsClient = LocationServices.getSettingsClient(this)
val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())

위치권한 소스

위치 서비스 클라이언트 만들기

private lateinit var fusedLocationClient: FusedLocationProviderClient

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
}

마지막으로 알려진 위치 가져오기

fusedLocationClient.lastLocation
        .addOnSuccessListener { location : Location? ->
            // Got last known location. In some rare situations this can be null.
        }

fusedLocationClient.lastLocation .addOnSuccessListener { location : Location? -> // Got last known location. In some rare situations this can be null. }

  • getLastLocation() 메서드에서 위치 객체가 null일 경우,
    • 기기 설정에서 위치 사용을 중지하면 캐시도 지워지고 마지막 위치도 null 반환
    • 기기에서 위치를 기록한 적이 없는 경우, 새기기 이거나 기본 설정으로 복원된 기능인 경우
    • 기기의 서비스가 다시 시작 되었으며, 서비스가 다시 시작된 후 위치를 요청한 활성 통합 위치 정보 제공자 클라이언트 없는 경우

참고자료

관련글 더보기