대략적인 위치

대략적인 위치만 나타내고 세로로 배치된 버튼이 3개 있는 대화상자
그림 1. 앱에서 ACCESS_COARSE_LOCATION만 요청할 때 표시되는 시스템 권한 대화상자

Android 12는 백그라운드 위치 액세스일회성 권한 등 위치 정보 액세스 권한 모델의 최근 플랫폼 변경사항에 기반합니다. 앱이 Android 12를 타겟팅하면 사용자는 앱이 ACCESS_FINE_LOCATION 런타임 권한을 요청하더라도 대략적인 위치 정보만 검색하도록 요청할 수 있습니다.

앱이 ACCESS_COARSE_LOCATION은 요청하지만 ACCESS_FINE_LOCATION은 요청하지 않으면 이 페이지에 설명된 변경사항은 적용되지 않습니다. 그림 1은 앱이 Android 12를 타겟팅하고 ACCESS_COARSE_LOCATION만 요청할 때 사용자에게 표시되는 대화상자를 보여줍니다.

사용자 개인 정보 보호를 더 잘 준수하려면 ACCESS_COARSE_LOCATION만 요청하는 것이 좋습니다. 대략적인 위치 정보 액세스 권한만 있더라도 대부분의 사용 사례를 처리할 수 있습니다.

앱이 Android 12를 타겟팅하고 개발자가 ACCESS_FINE_LOCATION 권한을 요청하면 ACCESS_COARSE_LOCATION 권한도 요청해야 합니다. 단일 런타임 요청에 두 권한을 모두 포함해야 합니다. ACCESS_FINE_LOCATION만 요청하려고 하면 시스템이 요청을 무시하고 다음 오류 메시지를 Logcat에 기록합니다. ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION

사용자가 대략적인 위치와 정확한 위치 중에서 선택

두 가지 옵션 세트가 세로로 배치된 대화상자
그림 2. 앱이 Android 12를 타겟팅하고 단일 런타임 요청에서 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION을 모두 요청할 때 표시되는 시스템 권한 대화상자

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

  • 정확한 위치: ACCESS_FINE_LOCATION 권한이 제공하는 위치 정확도를 제공합니다.
  • 대략적인 위치: ACCESS_COARSE_LOCATION 권한이 제공하는 위치 정확도를 제공합니다.

그림 2는 사용자가 선택할 수 있도록 대화상자에 두 가지 새로운 옵션에 관한 시각적 신호가 포함되어 있음을 보여줍니다. 사용자가 위치 정확도에 관해 결정하면 3개 버튼 중 하나를 탭하여 권한 부여 기간을 선택합니다. 이러한 버튼은 Android 11(API 수준 30)을 실행하는 기기의 위치 정보 액세스 권한 대화상자에 표시되는 버튼과 같습니다.

Android 12에서 사용자는 시스템 설정으로 이동하여 앱의 타겟 SDK 버전과 상관없이 모든 앱의 선호하는 위치 정확도를 설정할 수 있습니다. 앱을 Android 11 이하를 실행하는 기기에 설치하고 Android 12로 업그레이드하는 경우에도 마찬가지입니다. 사용자가 권한 대화상자나 시스템 설정에서 앱의 위치 액세스 권한을 정확한 위치에서 대략적인 위치로 다운그레이드하면 시스템이 앱 프로세스를 다시 시작합니다. 따라서 런타임 권한 요청 권장사항을 따르는 것이 특히 중요합니다.

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

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

정확한 위치 대략적인 위치
앱 사용 중에만 허용 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))

자바

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
});

사용자 선택은 백그라운드 위치 액세스에도 영향을 미침

시스템이 ACCESS_BACKGROUND_LOCATION 권한을 앱에 부여하면 위치 정보 액세스 권한 대화상자에서 사용자가 선택한 사항이 백그라운드 위치 액세스에도 적용됩니다.

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

정확한 위치로 업그레이드

대략적인 위치는 앱이 현재 ACCESS_FINE_LOCATION 권한을 사용하여 정확한 위치에 액세스하는 것에 의존하는 경우 앱에 영향을 미칠 수 있습니다.

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

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

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

앱의 대략적인 위치 처리 방식 테스트

사용자가 구성할 수 있는 위치 정확도를 지원하도록 앱을 업데이트해야 하는지 평가하려면 이 섹션에 설명된 테스트를 완료하세요.

대화상자에서 대략적인 위치 요청 처리

앱이 새 대화상자에서 대략적인 위치 액세스 권한을 보유하도록 하는 사용자의 요청을 앱이 처리하는 방식을 확인하려면 다음을 실행하세요.

  1. ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION을 모두 요청합니다.
  2. 표시되는 대화상자(그림 2)에서 상단의 대략적인 위치와 하단의 앱 사용 중에만 허용이나 이번만 허용을 선택합니다.
  3. 앱에 대략적인 위치 액세스 권한만 있는 경우에도 앱의 사용 사례가 여전히 예상대로 작동하는지 확인합니다.

시스템 설정에서 대략적인 위치 다운그레이드 처리

그림 5. 이제 시스템 설정에서 앱의 위치 정보 액세스 권한 화면에 정확한 위치 사용이 포함됨. 이 옵션은 화면 상단에 표시되는 위치 액세스 설정과는 별개입니다.

시스템 설정에서 앱의 위치 액세스 권한을 정확한 위치에서 대략적인 위치로 변경하라는 사용자의 요청을 앱이 처리하는 방식을 확인하려면 다음을 실행하세요.

  1. ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION을 모두 요청합니다.
  2. 표시되는 대화상자(그림 2)에서 상단의 정확한 위치와 하단의 앱 사용 중에만 허용이나 이번만 허용을 선택합니다.
  3. 시스템 설정에서 앱의 권한 화면으로 이동합니다.
  4. 위치 정보 액세스 권한 화면에서 정확한 위치 사용을 사용 중지합니다. 이 옵션은 그림 5에 나와 있습니다.

    모든 권한 다운그레이드와 마찬가지로 시스템이 앱 프로세스를 다시 시작합니다.

  5. 앱에 대략적인 위치 액세스 권한만 있는 경우에도 앱의 사용 사례가 여전히 예상대로 작동하는지 확인합니다.

시스템 설정에서 정확한 위치 업그레이드 처리

시스템 설정에서 앱의 위치 액세스 권한을 대략적인 위치에서 정확한 위치로 변경하라는 사용자의 요청을 앱이 처리하는 방식을 확인하려면 다음을 실행하세요.

  1. ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION을 모두 요청합니다.
  2. 표시되는 대화상자(그림 2)에서 상단의 대략적인 위치와 하단의 앱 사용 중에만 허용이나 이번만 허용을 선택합니다.
  3. 시스템 설정에서 앱의 권한 화면으로 이동합니다.
  4. 위치 정보 액세스 권한 화면에서 그림 5와 같이 정확한 위치 사용을 사용 설정합니다.

    이 권한 변경은 업그레이드이므로 시스템이 앱을 다시 시작하지 않습니다.

  5. 앱이 위치 기반 사용 사례에서 더 정확한 위치 데이터를 수신하는지 확인합니다.

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

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