위치 정보 액세스 권한 요청

사용자 개인 정보를 보호하려면 위치 서비스를 사용하는 앱에서 위치 정보 액세스 권한을 요청해야 합니다.

위치 정보 액세스 권한을 요청할 때는 다른 런타임 권한을 요청할 때와 동일한 권장사항을 따르세요. 위치 정보 액세스 권한에 있어 한 가지 중요한 차이점은 시스템에 위치와 관련된 여러 권한이 포함된다는 것입니다. 어떤 권한을 어떻게 요청하는지는 앱 사용 사례의 위치 요구사항에 따라 다릅니다.

이 페이지에서는 다양한 위치 요구사항 유형을 설명하고 각 사례에서 위치 정보 액세스 권한을 요청하는 방법을 안내합니다.

위치 정보 액세스 권한 유형

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

포그라운드 위치

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

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

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

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

    또한 다음 코드 스니펫과 같이 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>

백그라운드 위치

앱의 기능이 지속적으로 다른 사용자와 위치를 공유하거나 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제곱킬로미터 이내입니다. ACCESS_COARSE_LOCATION 권한을 선언하고 ACCESS_FINE_LOCATION 권한은 선언하지 않으면 앱이 이 수준의 정확도로 위치를 수신할 수 있습니다.
정확한 위치
최대한 정확한 기기 위치 추정치를 제공합니다. LocationManagerService 또는 FusedLocationProvider에서 가져온 경우 이 위치 추정치의 오차 범위는 일반적으로 약 50미터 이내이며 몇 미터 이내 또는 그 이상으로 정확할 때도 있습니다. ACCESS_FINE_LOCATION 권한을 선언하면 앱이 이 수준의 정확도로 위치를 수신할 수 있습니다.

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

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

런타임 시 위치 정보 액세스 권한 요청

앱의 기능에 위치 정보 액세스 권한이 필요하다면 사용자가 이 기능과 상호작용할 때까지 기다린 후 권한을 요청합니다. 이 워크플로는 앱 권한 요청 방법에 대한 가이드에 설명된 대로 컨텍스트에서 런타임 권한을 요청하는 것에 대한 권장사항을 따릅니다.

그림 1은 이 프로세스를 실행하는 방법의 예를 보여줍니다. 앱에는 포그라운드 위치 정보 액세스 권한이 필요한 '위치 공유' 기능이 포함되어 있습니다. 그러나 앱은 사용자가 위치 공유 버튼을 선택할 때까지 위치 정보 액세스 권한을 요청하지 않습니다.

사용자가 위치 공유 버튼을 선택한 후 시스템의 위치 정보 액세스 권한 대화상자가 표시됩니다.
그림 1. 포그라운드 위치 정보 액세스 권한이 필요한 위치 공유 기능. 이 기능은 사용자가 앱 사용 중에만 허용을 선택하면 사용 설정됩니다.

사용자는 대략적인 위치만 부여할 수 있음

Android 12(API 수준 31) 이상에서는 앱에서 ACCESS_FINE_LOCATION 런타임 권한을 요청하더라도 사용자는 앱이 대략적인 위치 정보만 검색하도록 요청할 수 있습니다.

이 잠재적 사용자 동작을 처리하려면 ACCESS_FINE_LOCATION 권한을 자체적으로 요청하지 마세요. 대신 단일 런타임 요청에서 ACCESS_FINE_LOCATION 권한과 ACCESS_COARSE_LOCATION 권한을 모두 요청하세요. ACCESS_FINE_LOCATION만 요청하려고 하면 시스템이 일부 Android 12 버전에서 요청을 무시합니다. 앱이 Android 12 이상을 타겟팅하는 경우 시스템은 다음 오류 메시지를 Logcat에 기록합니다.

ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.

앱이 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION을 모두 요청하면 시스템 권한 대화상자에는 다음과 같은 사용자 옵션이 포함됩니다.

  • 정확한 위치: 앱에서 정확한 위치 정보를 가져올 수 있도록 허용합니다.
  • 대략적인 위치: 앱에서 대략적인 위치 정보만 가져올 수 있도록 허용합니다.

그림 3은 사용자가 선택할 수 있도록 대화상자에 두 가지 새로운 옵션에 관한 시각적 신호가 포함되어 있음을 보여줍니다. 사용자가 위치 정확성에 관해 결정하면 3개 버튼 중 하나를 탭하여 권한 부여 기간을 선택합니다.

Android 12 이상에서 사용자는 시스템 설정으로 이동하여 앱의 타겟 SDK 버전과 상관없이 모든 앱의 선호하는 위치 정확성을 설정할 수 있습니다. 앱을 Android 11 이하를 실행하는 기기에 설치하고 Android 12 이상으로 업그레이드하는 경우에도 마찬가지입니다.

대략적인 위치만 나타내고 세로로 배치된 버튼이 3개 있는 대화상자
그림 2. 앱에서 ACCESS_COARSE_LOCATION만 요청할 때 표시되는 시스템 권한 대화상자
두 가지 옵션 세트가 세로로 배치된 대화상자
그림 3. 앱에서 단일 런타임 요청으로 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION을 모두 요청할 때 표시되는 시스템 권한 대화상자

사용자 선택이 권한 부여에 영향을 미침

다음 표는 사용자가 권한 런타임 대화상자에서 선택하는 옵션에 따라 시스템이 앱에 부여하는 권한을 보여줍니다.

정확한 위치 대략적인 위치
앱 사용 중에만 허용 ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
ACCESS_COARSE_LOCATION
이번만 허용 ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
ACCESS_COARSE_LOCATION
거부 위치 정보 액세스 권한 없음 위치 정보 액세스 권한 없음

시스템이 앱에 부여한 권한을 확인하려면 권한 요청의 반환 값을 확인합니다. 다음과 유사한 코드에서 Jetpack 라이브러리를 사용하거나 권한 요청 코드를 직접 관리하는 플랫폼 라이브러리를 사용할 수 있습니다.

Kotlin

val locationPermissionRequest = registerForActivityResult(
        ActivityResultContracts.RequestMultiplePermissions()
    ) { permissions ->
        when {
            permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> {
                // Precise location access granted.
            }
            permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> {
                // Only approximate location access granted.
            } else -> {
                // No location access granted.
            }
        }
    }

// ...

// Before you perform the actual permission request, check whether your app
// already has the permissions, and whether your app needs to show a permission
// rationale dialog. For more details, see Request permissions.
locationPermissionRequest.launch(arrayOf(
    Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.ACCESS_COARSE_LOCATION))

Java

ActivityResultLauncher<String[]> locationPermissionRequest =
    registerForActivityResult(new ActivityResultContracts
        .RequestMultiplePermissions(), result -> {
            Boolean fineLocationGranted = result.getOrDefault(
                    Manifest.permission.ACCESS_FINE_LOCATION, false);
            Boolean coarseLocationGranted = result.getOrDefault(
                    Manifest.permission.ACCESS_COARSE_LOCATION,false);
            if (fineLocationGranted != null && fineLocationGranted) {
                // Precise location access granted.
            } else if (coarseLocationGranted != null && coarseLocationGranted) {
                // Only approximate location access granted.
            } else {
                // No location access granted.
            }
        }
    );

// ...

// Before you perform the actual permission request, check whether your app
// already has the permissions, and whether your app needs to show a permission
// rationale dialog. For more details, see Request permissions.
locationPermissionRequest.launch(new String[] {
    Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.ACCESS_COARSE_LOCATION
});

정확한 위치로 업그레이드 요청

사용자에게 대략적인 위치에서 정확한 위치로 앱의 액세스 권한을 업그레이드하도록 요청할 수 있습니다. 사용자에게 앱의 액세스 권한을 정확한 위치로 업그레이드하라고 요청하기 전에 앱의 사용 사례에 이러한 수준의 정확성이 꼭 필요한지 생각해보세요. 앱에서 블루투스나 Wi-Fi를 통해 기기를 근처 기기와 페어링해야 한다면 ACCESS_FINE_LOCATION 권한을 요청하는 대신 호환 기기 페어링이나 블루투스 권한을 사용하는 것이 좋습니다.

사용자에게 앱의 위치 액세스를 대략적인 위치에서 정확한 위치로 업그레이드하라고 요청하려면 다음을 실행하세요.

  1. 필요하다면 앱에 권한이 필요한 이유를 설명합니다.
  2. ACCESS_FINE_LOCATION 권한과 ACCESS_COARSE_LOCATION 권한을 함께 다시 요청합니다. 사용자가 이미 시스템이 앱에 대략적인 위치 권한을 부여하도록 허용했으므로 그림 4그림 5와 같이 이번에는 시스템 대화상자가 다릅니다.
&#39;정확한 위치로 변경&#39;, &#39;이번만 허용&#39;, &#39;거부&#39; 옵션이 있는 대화상자
그림 4. 사용자가 이전에는 대략적인 위치앱 사용 중에만 허용을 선택함(그림 3의 대화상자에서)
&#39;이번만 허용&#39;과 &#39;거부&#39; 옵션이 있는 대화상자
그림 5. 사용자가 이전에는 대략적인 위치이번만 허용을 선택함(그림 3의 대화상자에서)

처음에 포그라운드 위치만 요청

앱의 여러 기능에 위치 정보 액세스 권한이 필요하더라도 이 중 일부 기능에만 백그라운드 위치 액세스 권한이 필요할 수 있습니다. 따라서 앱은 포그라운드 위치 정보 액세스 권한을 요청한 다음 백그라운드 위치 정보 액세스 권한을 요청하여 위치 정보 액세스 권한의 점진적 요청을 실행하는 것이 좋습니다. 점진적 요청을 실행하면 사용자가 앱의 어떤 기능에 백그라운드 위치 정보 액세스 권한이 필요한지 더 잘 파악할 수 있으므로 사용자에게 더 많은 컨트롤과 투명성을 제공합니다.

그림 6는 점진적 요청을 처리하도록 설계된 앱의 예를 보여줍니다. '현재 위치 표시' 및 '주변 장소 추천' 기능에는 모두 포그라운드 위치 정보 액세스 권한이 필요합니다. 그러나 '주변 장소 추천' 기능에만 백그라운드 위치 정보 액세스 권한이 필요합니다.

포그라운드 위치 정보 액세스 권한을 사용 설정하는 버튼은 백그라운드 위치를 사용 설정하는 버튼에서 화면 절반 길이만큼 떨어져 배치됩니다.
그림 6. 두 기능에 모두 위치 정보 액세스 권한이 필요하지만 '주변 장소 추천' 기능에만 백그라운드 위치 정보 액세스 권한이 필요합니다.

점진적 요청을 실행하는 프로세스는 다음과 같습니다.

  1. 먼저 앱은 그림 1의 '위치 공유' 기능이나 그림 2의 '현재 위치 표시' 기능과 같이 포그라운드 위치 정보 액세스 권한이 필요한 기능으로 사용자를 안내해야 합니다.

    앱에 포그라운드 위치 정보 액세스 권한이 있을 때까지 백그라운드 위치 정보 액세스 권한이 필요한 기능에 대한 사용자 액세스를 사용 중지하는 것이 좋습니다.

  2. 나중에 사용자가 백그라운드 위치 정보 액세스 권한이 필요한 기능을 살펴볼 때 백그라운드 위치 정보 액세스 권한을 요청할 수 있습니다.

필요한 경우 백그라운드 위치 요청

그림 7. 설정 페이지에 백그라운드 위치 액세스 권한을 부여하는 항상 허용 옵션이 있음

대상 SDK 버전에 따른 권한 대화상자 콘텐츠

앱의 기능이 Android 10(API 수준 29)을 실행하는 기기에서 백그라운드 위치를 요청하면 시스템 권한 대화상자에는 항상 허용이라는 옵션이 포함됩니다. 사용자가 이 옵션을 선택하면 앱의 기능에 백그라운드 위치 정보 액세스 권한이 부여됩니다.

하지만 Android 11(API 수준 30) 이상에서는 시스템 대화상자에 항상 허용 옵션이 포함되지 않습니다. 대신 사용자는 그림 7에 나와 있는 것처럼 설정 페이지에서 백그라운드 위치를 사용 설정해야 합니다.

백그라운드 위치 정보 액세스 권한을 요청할 때 권장사항에 따라 이 설정 페이지로 사용자가 이동하도록 할 수 있습니다. 권한 부여 프로세스는 앱의 타겟 SDK 버전에 따라 다릅니다.

Android 11 이상을 타겟팅하는 앱

앱에 ACCESS_BACKGROUND_LOCATION 권한이 부여되지 않고 shouldShowRequestPermissionRationale()true를 반환하면 다음이 포함된 교육용 UI를 사용자에게 표시합니다.

  • 앱의 기능에 백그라운드 위치 액세스 권한이 필요한 이유에 관한 명확한 설명
  • 백그라운드 위치 액세스 권한을 부여하고 사용자에게 표시되는 설정 옵션 라벨(예: 그림 7의 항상 허용). getBackgroundPermissionOptionLabel()을 호출하여 이 라벨을 가져올 수 있습니다. 이 메서드의 반환 값은 사용자 기기의 언어 환경설정으로 현지화됩니다.
  • 권한을 거부하는 사용자 옵션. 사용자가 백그라운드 위치 액세스를 거부하더라도 앱을 계속 사용할 수 있어야 합니다.
사용자는 시스템 알림을 탭하여 앱의 위치 설정을 변경할 수 있습니다.
그림 8. 사용자가 앱에 백그라운드 위치 정보 액세스 권한을 부여했다고 사용자에게 알리는 알림

Android 10 이하를 타겟팅하는 앱

앱의 기능이 백그라운드 위치 액세스를 요청하면 사용자에게 시스템 대화상자가 표시됩니다. 이 대화상자에는 설정 페이지에서 앱의 위치 정보 액세스 권한 옵션으로 이동하는 옵션이 포함되어 있습니다.

앱이 이미 위치 정보 액세스 권한 요청의 권장사항을 준수한다면 이 동작을 지원하기 위해 어떠한 변경도 할 필요가 없습니다.

사용자가 백그라운드 위치 정확성에 영향을 줄 수 있음

사용자가 대략적인 위치를 요청하면 위치 정보 액세스 권한 대화상자 내 사용자의 선택이 백그라운드 위치에도 적용됩니다. 예를 들어 사용자가 앱에 ACCESS_BACKGROUND_LOCATION 권한을 부여하지만 포그라운드에서 대략적인 위치 액세스 권한만 부여하면 앱은 백그라운드에서도 대략적인 위치 액세스 권한만 보유합니다.

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

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

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

앱에서 위치 정보 액세스 권한, 특히 ACCESS_FINE_LOCATION 권한에 종속된 SDK를 사용하는지 확인합니다. SDK 종속 항목 동작 알아보기는 Medium의 이 도움말을 참고하세요.

추가 리소스

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

Codelab

동영상

샘플

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