Android 11의 권한 업데이트

Android 11에서는 사용자가 위치, 마이크, 카메라에 관해 더욱 세분화된 권한을 지정할 수 있습니다. 또한 시스템은 Android 11 이상을 타겟팅하는 사용하지 않는 앱의 권한을 재설정하며 앱은 시스템 알림 창을 사용하거나 전화번호와 관련된 정보를 읽을 경우 선언하는 권한을 업데이트해야 할 수 있습니다.

일회성 권한

Android 11부터 앱이 위치, 마이크 또는 카메라와 관련된 권한을 요청할 때마다 사용자에게 표시되는 권한 대화상자에 이번만 허용이라는 옵션이 포함됩니다. 사용자가 대화상자에서 이 옵션을 선택하면 임시 일회성 권한이 앱에 부여됩니다.

시스템이 일회성 권한을 처리하는 방식에 관해 자세히 알아보세요.

사용하지 않는 앱의 권한 자동 재설정

앱이 Android 11 이상을 타겟팅하고 몇 달 동안 사용되지 않은 경우 시스템에서는 사용자가 앱에 부여한 민감한 런타임 권한을 자동으로 재설정하여 사용자 데이터를 보호합니다. 이 작업은 사용자가 시스템 설정에서 권한을 확인하고 앱의 액세스 수준을 거부로 변경한 것과 같은 효과를 발휘합니다. 앱이 런타임 시 권한 요청 권장사항을 준수하면 앱을 변경할 필요가 없습니다. 사용자가 앱의 기능과 상호작용할 때 기능에 필요한 권한이 있는지 확인해야 하기 때문입니다.

시스템에서 사용하지 않는 앱의 권한 자동 재설정 방법에 관해 자세히 알아보세요.

권한 대화상자 공개 상태

Android 11부터 사용자가 앱이 기기에 설치된 전체 기간 동안 특정 권한에 관해 거부를 두 번 이상 탭하면 앱에서 그 권한을 다시 요청하는 경우 사용자에게 시스템 권한 대화상자가 표시되지 않습니다. 이러한 사용자의 작업은 '다시 묻지 않음'을 의미합니다. 이전 버전에서는 사용자가 이전에 '다시 묻지 않음' 체크박스 또는 옵션을 선택하지 않는 한 앱에서 권한을 요청할 때마다 사용자에게 시스템 권한 대화상자가 표시되었습니다. Android 11에서 이 동작 변경은 사용자가 거부를 선택한 권한을 반복적으로 요청하지 못하게 합니다.

앱이 권한을 영구적으로 거부했는지 확인하려면(디버깅 및 테스트 목적) 다음 명령어를 사용하세요.

adb shell dumpsys package PACKAGE_NAME

여기서 PACKAGE_NAME은 검사할 패키지의 이름입니다.

명령어의 출력에는 다음과 같은 섹션이 포함됩니다.

...
runtime permissions:
  android.permission.POST_NOTIFICATIONS: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED]
  android.permission.ACCESS_FINE_LOCATION: granted=false, flags=[ USER_SET|USER_FIXED|USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED]
  android.permission.BLUETOOTH_CONNECT: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED]
...

사용자가 한 번 거부한 권한은 USER_SET으로 플래그가 지정됩니다. 거부를 두 번 선택하여 영구적으로 거부된 권한은 USER_FIXED로 플래그가 지정됩니다.

테스트 중에는 요청 대화상자가 표시되지 않을 때 테스터가 놀라지 않도록 이러한 플래그를 재설정하는 것이 좋습니다. 이렇게 하려면 다음 명령어를 사용합니다.

adb shell pm clear-permission-flags PACKAGE_NAME PERMISSION_NAME user-set user-fixed

PERMISSION_NAME은 재설정하려는 권한의 이름입니다. Android 앱 권한의 전체 목록을 보려면 권한 API 참조 페이지를 방문하세요.

앱의 권한 거부 처리 방법을 자세히 알아보세요.

시스템 알림 창 변경사항

Android 11에서는 앱에 SYSTEM_ALERT_WINDOW 권한이 부여되는 방식이 몇 가지 변경되었습니다. 이 변경사항은 권한이 더 의도적으로 부여되도록 하여 사용자를 보호하기 위한 것입니다.

요청에 따라 특정 앱에 SYSTEM_ALERT_WINDOW 권한이 자동으로 부여됨

요청에 따라 앱의 특정 클래스에 SYSTEM_ALERT_WINDOW 권한이 자동으로 부여됩니다.

  • ROLE_CALL_SCREENING이 있고 SYSTEM_ALERT_WINDOW를 요청하는 모든 앱에 자동으로 권한이 부여됩니다. 앱이 ROLE_CALL_SCREENING을 잃으면 권한을 잃게 됩니다.

  • 사용자가 앱에 대한 권한을 명시적으로 거부하지 않는 한 MediaProjection을 통해 화면을 캡처하고 SYSTEM_ALERT_WINDOW를 요청하는 모든 앱에 자동으로 권한이 부여됩니다. 앱이 화면 캡처를 중지하면 권한을 잃게 됩니다. 이 사용 사례는 주로 게임 실시간 스트리밍 앱을 대상으로 합니다.

이러한 앱에서는 SYSTEM_ALERT_WINDOW 권한을 얻기 위해 ACTION_MANAGE_OVERLAY_PERMISSION을 전송할 필요가 없습니다. 앱에서 간단히 SYSTEM_ALERT_WINDOW를 직접 요청할 수 있습니다.

MANAGE_OVERLAY_PERMISSION 인텐트는 항상 사용자를 시스템 권한 화면으로 안내함

Android 11부터 ACTION_MANAGE_OVERLAY_PERMISSION 인텐트는 앱에 SYSTEM_ALERT_WINDOW 권한을 부여하거나 취소할 수 있는 최상위 설정 화면으로 사용자를 항상 안내합니다. 인텐트의 모든 package: 데이터는 무시됩니다.

이전 버전의 Android에서는 ACTION_MANAGE_OVERLAY_PERMISSION 인텐트가 권한을 관리하는 앱별 화면으로 사용자를 안내하는 패키지를 지정할 수 있습니다. Android 11부터 이 기능은 지원되지 않습니다. 대신 사용자는 먼저 권한을 부여하거나 취소할 앱을 선택해야 합니다. 이 변경사항은 권한이 더 의도적으로 부여되도록 하여 사용자를 보호하기 위한 것입니다.

전화번호

Android 11에서는 앱에서 전화번호를 읽을 때 사용하는 전화 관련 권한이 변경됩니다.

앱이 Android 11 이상을 타겟팅하고 다음 목록에 표시된 전화번호 API에 액세스해야 한다면 READ_PHONE_STATE 권한 대신 READ_PHONE_NUMBERS 권한을 요청해야 합니다.

앱에서 READ_PHONE_STATE를 선언하여 이전 목록의 메서드 이외의 메서드를 호출하는 경우 모든 Android 버전에서 READ_PHONE_STATE를 계속 요청할 수 있습니다. 그러나 이전 목록의 메서드에만 READ_PHONE_STATE 권한을 사용하는 경우 다음과 같이 매니페스트 파일을 업데이트하세요.

  1. 앱이 Android 10(API 수준 29) 이하에서만 권한을 사용하도록 READ_PHONE_STATE 선언을 변경합니다.
  2. READ_PHONE_NUMBERS 권한을 추가합니다.

다음 매니페스트 선언 스니펫이 이 프로세스를 보여줍니다.

<manifest>
    <!-- Grants the READ_PHONE_STATE permission only on devices that run
         Android 10 (API level 29) and lower. -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"
                     android:maxSdkVersion="29" />
    <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
</manifest>

추가 리소스

Android 11의 권한 변경사항에 관한 자세한 내용은 다음 자료를 참고하세요.

동영상

Android 11의 최신 개인 정보 보호 변경사항으로 개발