為數十億臺裝置提供許可權自動重置功能

Android開發者發表於2021-10-26

作者 / 軟體工程師 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 之間版本的裝置。

歡迎您持續關注我們,隨時獲取最新資訊。

歡迎您 點選這裡 向我們提交反饋,或分享您喜歡的內容、發現的問題。您的反饋對我們非常重要,感謝您的支援!

相關文章