위치 정보 액세스 권한 요청

Android에서 사용자 위치 정보를 요청하는 방법은 여러 가지가 있으며 최적의 방법은 사용 사례에 따라 다릅니다. 이 가이드에서는 다양한 위치 정보 액세스 시나리오를 설명하고 각 사례에서 위치 정보 액세스 권한을 요청하는 방법을 설명합니다.

시작하려면 모든 런타임 권한의 권장사항과 권한 요청을 최소화하기 위한 광범위한 가이드를 검토하세요.

위치 정보 액세스 권한 유형

각 권한에는 다음과 같은 특징이 있습니다.

포그라운드 위치

앱에 위치 정보를 한 번만 또는 정의된 시간 동안 공유하거나 수신하는 기능이 포함되어 있으면 이 기능에는 포그라운드 위치 정보 액세스 권한이 필요합니다. 몇 가지 예는 다음과 같습니다.

  • 내비게이션 앱에서 사용자가 세부 경로 안내를 받을 수 있는 기능
  • 메시지 앱에서 사용자가 현재 위치를 다른 사용자와 공유할 수 있는 기능

앱의 기능이 다음 상황 중 하나에서 기기의 현재 위치에 액세스한다면 시스템은 앱에서 포그라운드 위치를 사용하고 있다고 간주합니다.

  • 앱에 속한 활동이 표시됩니다.
  • 앱에서 포그라운드 서비스를 실행하고 있습니다. 포그라운드 서비스를 실행하고 있을 때 시스템은 지속적으로 알림을 표시하여 사용자 인지도를 높입니다. 사용자가 기기의 버튼을 누르거나 기기의 디스플레이를 끄는 등 앱이 백그라운드에 배치될 때 앱은 액세스 권한을 유지합니다.

    또한 다음 코드 스니펫과 같이 포그라운드 서비스 유형location을 선언해야 합니다. Android 10 (API 수준 29) 이상에서는 이 포그라운드 서비스 유형을 선언해야 합니다.

    <!-- Recommended for Android 9 (API level 28) and lower. -->
    <!-- Required for Android 10 (API level 29) and higher. -->
    <service
        android:name="MyNavigationService"
        android:foregroundServiceType="location" ... >
        <!-- Any inner elements would go here. -->
    </service>
    

다음 스니펫과 같이 앱에서 ACCESS_COARSE_LOCATION 권한이나 ACCESS_FINE_LOCATION 권한을 요청하면 포그라운드 위치의 필요성을 선언합니다.

<manifest ... >
  <!-- Always include this permission -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

  <!-- Include only if your app benefits from precise location access. -->
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

일회성 액세스 포그라운드에서 위치 데이터에 액세스하는 것 외에도 일부 사용 사례에서는 앱 사용 내내 지속적으로 업데이트하는 것이 아니라 앱 환경의 특정 시점에만 사용자 위치에 액세스해야 하는 추가적인 차이점이 있습니다. 이러한 경우 앱은 위치 버튼을 사용하여 앱 사용의 개별 세션에 대한 위치 액세스를 요청해야 합니다. 또한 앱이 Android 17 (API 수준 37) 이상을 타겟팅하고 세션 기반 위치 액세스가 필요한 기능만 포함하는 경우 Google Play 정책에 따라 위치 버튼을 사용해야 합니다. 자세한 내용은 위치 버튼 정책을 참고하세요.

백그라운드 위치

앱의 기능이 지속적으로 다른 사용자와 위치를 공유하거나 Geofencing API를 사용하는 경우 앱에는 백그라운드 위치 정보 액세스 권한이 필요합니다. 몇 가지 예는 다음과 같습니다.

  • 가족 위치 공유 앱에서 사용자가 가족 구성원과 지속적으로 위치를 공유할 수 있는 기능
  • IoT 앱에서 사용자가 집을 나갈 때 꺼지고 집에 돌아올 때 다시 켜지도록 홈 기기를 구성할 수 있는 기능

앱이 포그라운드 위치 섹션에서 설명된 상황 이외의 모든 상황에서 기기의 현재 위치에 액세스한다면 시스템은 앱에서 백그라운드 위치를 사용하고 있다고 간주합니다. 백그라운드 위치 정밀도는 앱에서 선언한 위치 정보 액세스 권한을 기반으로 하는 포그라운드 위치 정밀도와 동일합니다.

Android 10 (API 수준 29) 이상에서 개발자는 런타임 시 백그라운드 위치 정보 액세스 권한을 요청하기 위해 앱 매니페스트에서 ACCESS_BACKGROUND_LOCATION 권한을 선언해야 합니다. 백그라운드 위치 정보 액세스 이전 버전의 Android에서는 앱이 포그라운드 위치 정보 액세스 권한을 수신하면 자동으로 백그라운드 위치 정보 액세스 권한도 수신합니다.

<manifest ... >
  <!-- Required only when requesting background location access on
       Android 10 (API level 29) and higher. -->
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>

정확성

Android는 다음과 같은 수준의 위치 정확성을 지원합니다.

대략적인 위치
기기 위치 추정치를 제공합니다. 이 위치 추정치가 LocationManagerService 또는 FusedLocationProvider에서 제공된 경우 이 추정치는 약 3제곱킬로미터 (약 1.2제곱 마일) 이내로 정확합니다. ACCESS_COARSE_LOCATION 권한을 선언하고 ACCESS_FINE_LOCATION 권한은 선언하지 않으면 앱이 이 수준의 정확도로 위치를 수신할 수 있습니다.
정확한 위치
최대한 정확한 기기 위치 추정치를 제공합니다. 위치 추정치가 LocationManagerService 또는 FusedLocationProvider에서 제공된 경우 이 추정치는 일반적으로 약 50미터(160피트) 이내이며 때로는 몇 미터 (10피트) 이내 또는 더 정확합니다. ACCESS_FINE_LOCATION 권한을 선언하면 앱이 이 수준의 정확도로 위치를 수신할 수 있습니다.

사용자가 대략적인 위치 정보 액세스 권한을 부여하면 앱이 선언하는 위치 정보 액세스 권한과 관계없이 대략적인 위치에만 액세스할 수 있습니다.

사용자가 대략적인 위치 정보 액세스 권한만 부여해도 앱이 계속 작동해야 합니다. 앱의 기능에서 정확한 위치 액세스를 확실하게 요청하는 경우 사용자에게 앱이 정확한 위치에 액세스하는 것을 허용하도록 요청할 수 있습니다.ACCESS_FINE_LOCATION

백그라운드 위치 액세스 허용에 관한 알림

Android 10 (API 수준 29) 이상에서는 사용자가 백그라운드 위치 정보 액세스 권한을 부여한 후 앱의 기능이 백그라운드에서 기기 위치에 처음 액세스하면 시스템이 사용자에게 전송할 알림을 예약합니다. 이 알림은 사용자가 앱에서 항상 기기 위치에 액세스하도록 허용했음을 사용자에게 알려줍니다. 알림 예는 그림 8에 표시됩니다.

앱의 SDK 종속 항목에서 위치 요구사항 확인

앱에서 위치 정보 액세스 권한, 특히 ACCESS_FINE_LOCATION 권한에 종속된 SDK를 사용하는지 확인합니다. 자세한 내용은 Medium의 SDK 종속 항목 동작 알아보기 블로그 게시물을 참고하세요.

추가 리소스

Android의 위치 정보 액세스 권한에 관한 자세한 내용은 다음 자료를 참고하세요.

Codelab

동영상

샘플

  • 샘플 앱 위치 정보 액세스 권한 사용 방법을 보여줍니다.