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 中权限变更的更多信息,请查看以下资料: