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

32次阅读

共计 3392 个字符,预计需要花费 9 分钟才能阅读完成。

作者 / 软件工程师 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 之间版本的设施。

欢迎您继续关注咱们,随时获取最新资讯。

欢迎您 点击这里 向咱们提交反馈,或分享您喜爱的内容、发现的问题。您的反馈对咱们十分重要,感谢您的反对!

正文完
 0