作者 / 软件工程师 Peter Visontay 和 Bessie Jiang
贡献者 / 软件工程师 Inara Ramji、交互设计师 Rodrigo Farell、产品经理 James Kelly、项目经理 Henry Chin
大多数用户会在智能手机上破费大量工夫。无论是工作、玩游戏,还是与敌人分割,人们总会应用利用并将其作为数字化生存的次要路径。利用通常须要申请某些权限能力失常运行,但在任何给定的设施都有数十个利用的状况下,要让之前授予的权限放弃最新状态可能很艰难,特地是在您长时间未应用某个利用时。
咱们在 Android 11 中引入了 权限主动重置性能。这项性能有助于爱护用户的隐衷: 如果用户几个月未应用某利用,该性能就会主动重置此利用的 运行时权限,即申请时向用户显示提醒的权限。2021 年 12 月起,咱们会将这项性能扩大到数十亿台设施。该性能将主动在运行 Android 6.0 (API 级别 23) 或更高版本的应用 Google Play 服务 的设施上启用。
零碎将默认为面向 Android 11 (API 级别 30) 或更高版本的利用启用该性能。不过,用户能够为面向 API 级别 23 到 29 的利用手动启用权限主动重置性能。
那么,这对开发者来说意味着什么呢?
例外
一些利用和权限将主动免于吊销,如企业应用的流动设施管理员利用,以及由企业政策固定的权限。
申请用户停用主动重置
如有须要,开发者能够申请用户阻止零碎重置其利用的权限。实用于用户冀望利用次要在后盾运行,甚至无需与其互动的状况。您能够查看 次要用例。
比拟以后行为与新行为
必要的代码更改
如果一个利用面向 API 30 及更高版本,并申请用户停用权限主动重置,那么开发者须要做一些简略的代码更改。如果利用不停用主动重置,则无需进行代码更改。
注: 此 API 仅实用于 targetSDK 为 API 30 或更高版本的利用,因为仅这些利用具备权限主动重置。如果利用的 targetSDK 为 API 29 或更低版本,则开发者无需进行任何更改。
下表汇总了新的跨平台 API (与 Android 11 中公布的 API 相比):
操作 | Android 11 API(实用于 Android 11 及更高版本的设施) | 新的跨平台 API(实用于 Android 6.0 及更高版本的设施,蕴含 Android 11 及更高版本的设施) |
---|---|---|
查看设施是否启用了权限主动重置性能 | 查看是否 Build.VERSION.SDK_INT >= Build.VERSION_CODES.R |
调用 androidx.core.content.PackageManagerCompat.getUnusedAppRestrictionsStatus() |
查看您的利用是否停用主动重置 | 调用 PackageManager.isAutoRevokeWhitelisted()) | 调用 androidx.core.content.PackageManagerCompat.getUnusedAppRestrictionsStatus() |
申请用户为您的利用停用主动重置 | 发送带操作的 intent Intent.ACTION_AUTO_REVOKE_PERMISSIONS | 发送利用 androidx.core.content.IntentCompat.createManageUnusedAppRestrictionsIntent() 创立的 intent |
这个跨平台 API 属于 Jetpack Core 库,将于 Jetpack Core v1.7.0 中推出,现已公布 Beta 版。
一个须要用户禁用主动停用主动重置的逻辑示例:
val future: ListenableFuture<Int> =
PackageManagerCompat.getUnusedAppRestrictionsStatus(context)
future.addListener({ onResult(future.get()) },
ContextCompat.getMainExecutor(context)
)
fun onResult(appRestrictionsStatus: Int) {when (appRestrictionsStatus) {
// Status could not be fetched. Check logs for details.
ERROR -> { }
// Restrictions do not apply to your app on this device.
FEATURE_NOT_AVAILABLE -> { }
// Restrictions have been disabled by the user for your app.
DISABLED -> { }
// If the user doesn't start your app for months, its permissions
// will be revoked and/or it will be hibernated.
// See the API_* constants for details.
API_30_BACKPORT, API_30, API_31 ->
handleRestrictions(appRestrictionsStatus)
}
}
fun handleRestrictions(appRestrictionsStatus: Int) {
// If your app works primarily in the background, you can ask the user
// to disable these restrictions. Check if you have already asked the
// user to disable these restrictions. If not, you can show a message to
// the user explaining why permission auto-reset and Hibernation should be
// disabled. Tell them that they will now be redirected to a page where
// they can disable these features.
Intent intent = IntentCompat.createManageUnusedAppRestrictionsIntent
(context, packageName)
// Must use startActivityForResult(), not startActivity(), even if
// you don't use the result code returned in onActivityResult().
startActivityForResult(intent, REQUEST_CODE)
}
以上逻辑实用于 Android 6.0 到 Android 10,以及 Android 11 和更高版本的设施。只需应用新 API 即可,您无需再调用 Android 11 的主动重置 API。
与 Android 12 中利用休眠性能的兼容
新 API 同样与 Android 12 (API 级别 31) 中引入的利用休眠性能 兼容。休眠是实用于未应用利用的一种新限度。该性能不适用于 Android 12 之前的操作系统版本。
如果权限主动重置和利用休眠都利用于一个利用,则 getUnusedAppRestrictionsStatus() API
将返回 API_31
。
公布时间表
- 2021 年 9 月 15 日 – 跨平台主动重置 API 现已进入测试阶段 (Jetpack Core 1.7.0 Beta 版库),所以开发者当初就能够开始应用这些 API。即便在不反对权限主动重置的设施上,应用这些 API 也是平安的 (API 在这些设施上会返回 FEATURE_NOT_AVAILABLE)。
- 2021 年 10 月 – 跨平台主动重置 API 可作为稳固的 API 应用 (Jetpack Core 1.7.0)。
- 2021 年 12 月 – 权限主动重置性能将开始在由 Google Play 服务提供反对并运行 Android 6.0 到 Android 10 之间版本的设施上逐步推广。在这些设施上,用户能够返回主动重置设置页面,针对特定利用启用 / 停用主动重置。零碎将在设施启用该性能几周后开始主动重置未应用利用的权限。
- 2022 年第 1 季度 – 权限主动重置性能将笼罩所有运行 Android 6.0 到 Android 10 之间版本的设施。
欢迎您继续关注咱们,随时获取最新资讯。
欢迎您 点击这里 向咱们提交反馈,或分享您喜爱的内容、发现的问题。您的反馈对咱们十分重要,感谢您的反对!