特殊权限用于保护对特别敏感或与用户隐私没有直接关系的系统资源的访问。这些权限与安装时权限和运行时权限不同。
特殊权限的一些示例包括:
- 安排精确闹钟。
- 在其他应用之上显示和绘制。
- 访问所有存储数据。
声明特殊权限的应用会显示在系统设置的特殊应用访问页面(图 1)中。要授予应用特殊权限,用户必须导航到此页面:设置 > 应用 > 特殊应用访问。
工作流程
要请求特殊权限,请执行以下操作:
- 在应用的清单文件中,声明您的应用可能需要请求的特殊权限。
- 设计您的应用的用户体验,以便应用中的特定操作与特定的特殊权限相关联。让用户知道哪些操作可能需要他们授予权限才能让您的应用访问私人用户数据。
- 等待用户在您的应用中调用需要访问特定私人用户数据的任务或操作。届时,您的应用可以请求访问该数据所需的特殊权限。
- 检查用户是否已授予您的应用所需的特殊权限。为此,请使用每个权限的自定义检查函数。如果已授予,您的应用可以访问私人用户数据。如果没有,请继续下一步。注意:您必须在每次执行需要该权限的操作时检查您是否拥有该权限。
- 在界面元素中向用户展示理由,清楚地解释您的应用尝试访问哪些数据,以及如果用户授予特殊权限,应用可以为用户提供哪些好处。此外,由于您的应用会引导用户前往系统设置授予权限,因此还应包含简要说明,解释用户如何在其中授予权限。理由界面应提供明确的选项,供用户选择不授予权限。用户确认理由后,继续下一步。
- 请求您的应用访问私人用户数据所需的特殊权限。这可能涉及一个意图,指向系统设置中用户可以授予权限的相应页面。与运行时权限不同,没有弹出式权限对话框。
- 在
onResume()
方法中检查用户的响应 – 无论是选择授予还是拒绝特殊权限。 - 如果用户授予了您的应用权限,您可以访问私人用户数据。如果用户拒绝了权限,则优雅地降级您的应用体验,以便在没有该权限保护的信息的情况下为用户提供功能。
请求特殊权限
与运行时权限不同,用户必须从系统设置的特殊应用访问页面授予特殊权限。应用可以使用意图将用户发送到该页面,这会暂停应用并启动给定特殊权限的相应设置页面。用户返回应用后,应用可以在onResume()
函数中检查权限是否已授予。
以下示例代码展示了如何向用户请求SCHEDULE_EXACT_ALARMS
特殊权限。
val alarmManager = getSystemService<AlarmManager>()!!
when {
// if permission is granted, proceed with scheduling exact alarms…
alarmManager.canScheduleExactAlarms() -> {
alarmManager.setExact(...)
}
else -> {
// ask users to grant the permission in the corresponding settings page
startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
}
}
在onResume()
中检查权限并处理用户决定的示例代码
override fun onResume() {
// ...
if (alarmManager.canScheduleExactAlarms()) {
// proceed with the action (setting exact alarms)
alarmManager.setExact(...)
}
else {
// permission not yet approved. Display user notice and gracefully degrade
your app experience.
alarmManager.setWindow(...)
}
}
最佳实践和提示
以下各节提供了一些请求特殊权限时的最佳实践和注意事项。
每个权限都有自己的检查方法
特殊权限的运作方式与运行时权限不同。相反,请参阅权限 API 参考页面,并使用每个特殊权限的自定义访问检查函数。示例包括针对SCHEDULE_EXACT_ALARMS
权限的AlarmManager#canScheduleExactAlarms()
,以及针对MANAGE_EXTERNAL_STORAGE
权限的Environment#isExternalStorageManager()
。
在上下文中请求
与运行时权限类似,应用应在用户请求需要该权限的特定操作时在上下文中请求特殊权限。例如,等到用户安排在特定时间发送电子邮件时再请求SCHEDULE_EXACT_ALARMS
权限。
解释请求
在重定向到系统设置之前提供理由。由于用户会暂时离开应用以授予特殊权限,因此在启动意图前往系统设置中的特殊应用访问页面之前,请显示一个应用内界面。此界面应清楚地解释应用为什么需要该权限以及用户应如何在设置页面上授予它。