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的应用都会自动获得该权限,除非用户已明确拒绝该应用的权限。当应用停止捕获屏幕时,它会失去该权限。此用例主要用于游戏直播应用。

这些应用不需要发送ACTION_MANAGE_OVERLAY_PERMISSION来获取SYSTEM_ALERT_WINDOW权限;应用可以直接请求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_NUMBERS权限,而不是READ_PHONE_STATE权限。

如果您的应用声明READ_PHONE_STATE来调用列表中以外的方法,则您可以在所有 Android 版本中继续请求READ_PHONE_STATE。但是,如果您仅将READ_PHONE_STATE权限用于列表中的方法,请按如下所示更新您的清单文件

  1. 更改READ_PHONE_STATE的声明,以便您的应用仅在 Android 10(API 级别 29)及更低版本上使用该权限。
  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 中最新的隐私更改进行开发