在 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 intent 始终会将用户转至系统权限屏幕
从 Android 11 开始,ACTION_MANAGE_OVERLAY_PERMISSION
intent 始终会将用户转至顶级设置屏幕,用户可在其中授予或撤消应用的 SYSTEM_ALERT_WINDOW
权限。intent 中的任何 package:
数据都会被忽略。
在更低版本的 Android 中,ACTION_MANAGE_OVERLAY_PERMISSION
intent 可以指定一个软件包,它会将用户转至应用专用屏幕以管理权限。从 Android 11 开始将不再支持此功能,而是必须由用户先选择要授予或撤消哪些应用的权限。此变更可以让权限的授予更有目的性,从而达到保护用户的目的。
电话号码
Android 11 更改了您的应用在读取电话号码时使用的与电话相关的权限。
如果您的应用以 Android 11 或更高版本为目标平台,并且需要访问以下列表中显示的电话号码 API,则必须请求 READ_PHONE_NUMBERS
权限,而不是 READ_PHONE_STATE
权限。
TelephonyManager
类和TelecomManager
类中的getLine1Number()
方法。TelephonyManager
类中不受支持的getMsisdn()
方法。
如果您的应用声明 READ_PHONE_STATE
以调用前面列表中的方法以外的方法,您可以继续在所有 Android 版本中请求 READ_PHONE_STATE
。不过,如果您仅对前面列表中的方法使用 READ_PHONE_STATE
权限,请按以下方式更新您的清单文件:
- 更改
READ_PHONE_STATE
的声明,以使您的应用仅在 Android 10(API 级别 29)及更低版本中使用该权限。 - 添加
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 中对权限的变更,请查看以下资料: