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

Google Play 서비스 Location API를 사용하여 앱에서 마지막으로 알려진 사용자 기기의 위치를 요청할 수 있습니다. 대부분의 경우 사용자의 현재 위치에 관심이 있으며 사용자의 현재 위치는 일반적으로 마지막으로 알려진 기기의 위치와 같습니다.

구체적으로 마지막으로 알려진 기기의 위치를 가져오려면 통합 위치 정보 제공자를 사용하세요. 통합 위치 정보 제공자는 Google Play 서비스의 위치 API 중 하나입니다. 기본 위치 기술을 관리하고 단순한 API를 제공하므로, 높은 수준으로 요구사항(높은 정확도나 낮은 성능 등)을 지정할 수 있습니다. 이 API는 기기의 배터리 전력 사용을 최적화해 줍니다.

참고: 앱이 백그라운드에서 실행 중일 때 위치에 액세스하는 기능은 앱의 핵심 기능에 중요한 영향을 주며 사용자에게 적절하게 공개됩니다.

이 과정에서는 통합 위치 정보 제공자에서 getLastLocation() 메서드를 사용하여 기기 위치를 한 번 요청하는 방법을 설명합니다.

Google Play 서비스 설정하기

통합 위치 정보 제공자에 액세스하려면 앱의 개발 프로젝트에 Google Play 서비스를 포함해야 합니다. SDK Manager를 통해 Google Play 서비스 구성요소를 다운로드 및 설치하고 프로젝트에 라이브러리를 추가합니다. 자세한 내용은 Google Play 서비스 설정 가이드를 참조하세요.

앱 권한 지정

위치 서비스를 사용하는 앱은 위치 정보 액세스 권한을 요청해야 합니다. Android에서는 다음과 같은 위치 정보 액세스 권한을 제공합니다.

기기 위치에 액세스하려면 ACCESS_COARSE_LOCATION 또는 ACCESS_FINE_LOCATION을 요청하세요. 선택한 권한에 따라 FusedLocationProviderClient API에서 반환하는 위치 정확도가 달라집니다.

  • ACCESS_COARSE_LOCATION을 지정하면 API는 Wi-Fi, 모바일 데이터 또는 둘 다를 사용하여 기기 위치를 확인할 수 있습니다. API는 대략 도시 블록과 동등한 정확도로 위치를 반환합니다.
  • ACCESS_FINE_LOCATION을 지정하면 API는 GPS뿐만 아니라 Wi-Fi 및 모바일 데이터를 비롯하여 사용 가능한 위치 제공자에서 최대한 정확한 위치를 확인할 수 있습니다.

Android 10(API 수준 29) 이상을 타겟팅하고 앱이 백그라운드에 있는 동안 기기 위치에 액세스하려면 ACCESS_BACKGROUND_LOCATION 권한도 선언해야 합니다. 자세한 내용은 주기적 위치 업데이트를 받는 방법에 관한 가이드를 참조하세요.

이 과정에는 대략적인 위치만 필요합니다. 다음 코드 스니펫과 같이 앱 매니페스트의 uses-permission 요소를 사용하여 이 권한을 요청하세요.

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.google.android.gms.location.sample.basiclocationsample" >

      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    </manifest>
    

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

다음 코드 스니펫과 같이 활동의 onCreate() 메서드에서 통합 위치 정보 제공자 클라이언트의 인스턴스를 만드세요.

Kotlin

    private lateinit var fusedLocationClient: FusedLocationProviderClient

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

        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
    }
    

자바

    private FusedLocationProviderClient fusedLocationClient;

    // ..

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...

        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    }
    

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

위치 서비스 클라이언트를 만든 후 마지막으로 알려진 사용자 기기의 위치를 가져올 수 있습니다. 앱이 여기에 연결된 경우 통합 위치 정보 제공자의 getLastLocation() 메서드를 사용하여 기기 위치를 가져올 수 있습니다. 이 호출에서 반환하는 위치의 정확도는 이 문서의 앱 권한 지정 섹션에 설명된 대로 앱 매니페스트에 입력한 권한 설정에 따라 달라집니다.

마지막으로 알려진 위치를 요청하려면 getLastLocation() 메서드를 호출하세요. 다음 코드 스니펫은 요청 및 간단한 응답 처리 방법을 보여줍니다.

Kotlin

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

자바

    fusedLocationClient.getLastLocation()
            .addOnSuccessListener(this, new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {
                    // Got last known location. In some rare situations this can be null.
                    if (location != null) {
                        // Logic to handle location object
                    }
                }
            });
    

getLastLocation() 메서드는 지리적 위치의 위도 및 경도 좌표가 있는 Location 객체를 가져오는 데 사용할 수 있는 Task를 반환합니다. 다음 상황에서는 위치 객체가 null일 수 있습니다.

  • 기기 설정에서 위치가 사용 중지되어 있습니다. 위치를 사용 중지하면 캐시도 지워지므로 이전에 마지막 위치를 가져온 경우에도 결과는 null일 수 있습니다.
  • 기기에서 위치를 기록한 적이 없습니다. 예를 들면 새 기기이거나 기본 설정으로 복원된 기기일 수 있습니다.
  • 기기의 Google Play 서비스가 다시 시작되었으며 서비스가 다시 시작된 후 위치를 요청한 활성 통합 위치 정보 제공자 클라이언트가 없습니다. 이러한 상황이 발생하지 않도록 새 클라이언트를 만들고 직접 위치 업데이트를 요청할 수 있습니다. 자세한 내용은 위치 업데이트 받기를 참조하세요.

현재 최선의 예상치 유지

가장 최근의 getLastLocation() 호출에 포함된 Location 객체가 가장 정확할 것으로 예상할 수 있습니다. 그러나 위치 정확도는 다양하므로 가장 최근 값이 가장 좋은 것은 아닙니다. 여러 기준에 근거하여 표시할 위치를 선택하는 로직을 포함해야 합니다. 앱의 사용 사례와 필드 테스트 결과에 따라 일련의 기준 또한 다양합니다.

getLastLocation()에서 반환된 위치의 정확도를 검증하려면 다음이 포함된 단계를 완료하세요.

  • 가져온 위치가 이전에 가져온 위치보다 훨씬 더 최신인지 확인합니다.
  • 위치에서 주장하는 정확도가 이전 예상치의 정확도보다 좋은지 나쁜지 확인합니다.
  • 새 위치와 연결된 제공자를 확인합니다. 이 제공자를 앱의 캐시된 위치에서 사용하는 제공자보다 더 신뢰하는지 판단합니다.