查看原文
其他

为数十亿台设备提供权限自动重置功能

Android Android 开发者 2021-11-05
作者 / 软件工程师 Peter Visontay 和 Bessie Jiang

贡献者 / 软件工程师 Inara Ramji、交互设计师 Rodrigo Farell、产品经理 James Kelly、项目经理 Henry Chin


大多数用户会在智能手机上花费大量时间。无论是工作、玩游戏,还是与朋友联系,人们总会使用应用并将其作为数字化生活的主要途径。应用通常需要请求某些权限才能正常运行,但在任何给定的设备都有数十个应用的情况下,要让之前授予的权限保持最新状态可能很困难,特别是在您长时间未使用某个应用时。


我们在 Android 11 中引入了权限自动重置功能。这项功能有助于保护用户的隐私: 如果用户几个月未使用某应用,该功能就会自动重置此应用的运行时权限,即请求时向用户显示提示的权限。2021 年 12 月起,我们会将这项功能扩展到数十亿台设备。该功能将自动在运行 Android 6.0 (API 级别 23) 或更高版本的使用 Google Play 服务的设备上启用。


  • 权限自动重置功能
    https://developer.android.google.cn/about/versions/11/privacy/permissions#auto-reset

  • 运行时权限
    https://developer.android.google.cn/guide/topics/permissions/overview#runtime

  • Google Play 服务
    https://developers.google.cn/android


系统将默认为面向 Android 11 (API 级别 30) 或更高版本的应用启用该功能。不过,用户可以为面向 API 级别 23 到 29 的应用手动启用权限自动重置功能。


那么,这对开发者来说意味着什么呢?



例外



一些应用和权限将自动免于撤消,如企业使用的活动设备管理员应用,以及由企业政策固定的权限。



请求用户停用自动重置



如有需要,开发者可以请求用户阻止系统重置其应用的权限。适用于用户期望应用主要在后台运行,甚至无需与其互动的情况。您可以查看主要用例:
https://developer.android.google.cn/training/permissions/requesting#request-disable-auto-reset


比较当前行为与新行为



当前行为

新行为

Android 11 (API 级别 30) 及更高版本的设备上,权限会自动重置。

在以下设备上,权限会自动重置:
  • 使用 Google Play 服务并运行 Android 6.0 (API 级别 23) 到 Android 10 (API 级别 29) 之间版本 (包含两者) 的设备。
  • 所有运行 Android 11 (API 级别 30) 及更高版本的设备。

系统默认会为面向 Android 11 或更高版本的应用重置权限。用户可以为面向 Android 6.0 (API 级别 23) 的应用手动启用自动重置。

与当前行为相同。

应用可以请求用户停用针对该应用的自动重置。

与当前行为相同。



必要的代码更改



如果一个应用面向 API 30 及更高版本,并请求用户停用权限自动重置,那么开发者需要做一些简单的代码更改。如果应用不停用自动重置,则无需进行代码更改。


注: 此 API 仅适用于 targetSDK 为 API 30 或更高版本的应用,因为仅这些应用具有权限自动重置。如果应用的 targetSDK 为 API 29 或更低版本,则开发者无需进行任何更改。


下表汇总了新的跨平台 API (与 Android 11 中发布的 API 相比):


  • Android 11
    https://developer.android.google.cn/training/permissions/requesting#auto-reset-permissions-unused-apps


操作

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


  • PackageManager.isAutoRevokeWhitelisted()
    https://developer.android.google.cn/reference/android/content/pm/PackageManager#isAutoRevokeWhitelisted(java.lang.String)

  • Intent.ACTION_AUTO_REVOKE_PERMISSIONS
    https://developer.android.google.cn/reference/android/content/Intent#ACTION_AUTO_REVOKE_PERMISSIONS


这个跨平台 API 属于 Jetpack Core 库,将于 Jetpack Core v1.7.0 中推出,现已发布 Beta 版:

https://developer.android.google.cn/jetpack/androidx/releases/core


一个需要用户禁用自动停用自动重置的逻辑示例:
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 之前的操作系统版本。


  • Android 12 (API 级别 31) 中引入的应用休眠功能
    https://developer.android.google.cn/about/versions/12/behavior-changes-all


如果权限自动重置和应用休眠都应用于一个应用,则 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 之间版本的设备。


欢迎您持续关注官方微信公众账号,随时获取最新资讯。


欢迎您通过下方二维码向我们提交反馈,或分享您喜欢的内容、发现的问题。您的反馈对我们非常重要,感谢您的支持!




推荐阅读

如页面未加载,请刷新重试

 点击屏末 | 阅读原文 | 即刻了解权限自动重置功能更多信息




视频 小程序 ,轻点两下取消赞 在看 ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存