作者 / 軟件工程師 Peter Visontay 和 Bessie Jiang
貢獻(xiàn)者 / 軟件工程師 Inara Ramji掂器、交互設(shè)計師 Rodrigo Farell镶苞、產(chǎn)品經(jīng)理 James Kelly考婴、項目經(jīng)理 Henry Chin
大多數(shù)用戶會在智能手機上花費大量時間杏瞻。無論是工作晴叨、玩游戲涂召,還是與朋友聯(lián)系,人們總會使用應(yīng)用并將其作為數(shù)字化生活的主要途徑误澳。應(yīng)用通常需要請求某些權(quán)限才能正常運行耻矮,但在任何給定的設(shè)備都有數(shù)十個應(yīng)用的情況下,要讓之前授予的權(quán)限保持最新狀態(tài)可能很困難忆谓,特別是在您長時間未使用某個應(yīng)用時裆装。
我們在 Android 11 中引入了 權(quán)限自動重置功能。這項功能有助于保護(hù)用戶的隱私: 如果用戶幾個月未使用某應(yīng)用倡缠,該功能就會自動重置此應(yīng)用的 運行時權(quán)限哨免,即請求時向用戶顯示提示的權(quán)限。2021 年 12 月起毡琉,我們會將這項功能擴展到數(shù)十億臺設(shè)備铁瞒。該功能將自動在運行 Android 6.0 (API 級別 23) 或更高版本的使用 Google Play 服務(wù) 的設(shè)備上啟用。
系統(tǒng)將默認(rèn)為面向 Android 11 (API 級別 30) 或更高版本的應(yīng)用啟用該功能桅滋。不過慧耍,用戶可以為面向 API 級別 23 到 29 的應(yīng)用手動啟用權(quán)限自動重置功能。
那么丐谋,這對開發(fā)者來說意味著什么呢芍碧?
例外
一些應(yīng)用和權(quán)限將自動免于撤消,如企業(yè)使用的活動設(shè)備管理員應(yīng)用号俐,以及由企業(yè)政策固定的權(quán)限泌豆。
請求用戶停用自動重置
如有需要,開發(fā)者可以請求用戶阻止系統(tǒng)重置其應(yīng)用的權(quán)限吏饿。適用于用戶期望應(yīng)用主要在后臺運行踪危,甚至無需與其互動的情況。您可以查看 主要用例猪落。
比較當(dāng)前行為與新行為
必要的代碼更改
如果一個應(yīng)用面向 API 30 及更高版本贞远,并請求用戶停用權(quán)限自動重置,那么開發(fā)者需要做一些簡單的代碼更改笨忌。如果應(yīng)用不停用自動重置蓝仲,則無需進(jìn)行代碼更改。
注: 此 API 僅適用于 targetSDK 為 API 30 或更高版本的應(yīng)用官疲,因為僅這些應(yīng)用具有權(quán)限自動重置袱结。如果應(yīng)用的 targetSDK 為 API 29 或更低版本,則開發(fā)者無需進(jìn)行任何更改途凫。
下表匯總了新的跨平臺 API (與 Android 11 中發(fā)布的 API 相比):
操作 | Android 11 API(適用于 Android 11 及更高版本的設(shè)備) | 新的跨平臺 API(適用于 Android 6.0 及更高版本的設(shè)備垢夹,包含 Android 11 及更高版本的設(shè)備) |
---|---|---|
檢查設(shè)備是否啟用了權(quán)限自動重置功能 | 檢查是否 Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
|
調(diào)用 androidx.core.content.PackageManagerCompat.getUnusedAppRestrictionsStatus()
|
檢查您的應(yīng)用是否停用自動重置 | 調(diào)用 PackageManager.isAutoRevokeWhitelisted() | 調(diào)用 androidx.core.content.PackageManagerCompat.getUnusedAppRestrictionsStatus()
|
請求用戶為您的應(yīng)用停用自動重置 | 發(fā)送帶操作的 intent Intent.ACTION_AUTO_REVOKE_PERMISSIONS | 發(fā)送利用 androidx.core.content.IntentCompat.createManageUnusedAppRestrictionsIntent() 創(chuàng)建的 intent |
這個跨平臺 API 屬于 Jetpack Core 庫,將于 Jetpack Core v1.7.0 中推出颖榜,現(xiàn)已發(fā)布 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 和更高版本的設(shè)備掩完。只需使用新 API 即可噪漾,您無需再調(diào)用 Android 11 的自動重置 API。
與 Android 12 中應(yīng)用休眠功能的兼容
新 API 同樣與 Android 12 (API 級別 31) 中引入的應(yīng)用休眠功能 兼容且蓬。休眠是適用于未使用應(yīng)用的一種新限制欣硼。該功能不適用于 Android 12 之前的操作系統(tǒng)版本。
如果權(quán)限自動重置和應(yīng)用休眠都應(yīng)用于一個應(yīng)用恶阴,則 getUnusedAppRestrictionsStatus() API
將返回 API_31
诈胜。
發(fā)布時間表
- 2021 年 9 月 15 日 - 跨平臺自動重置 API 現(xiàn)已進(jìn)入測試階段 (Jetpack Core 1.7.0 Beta 版庫),所以開發(fā)者現(xiàn)在就可以開始使用這些 API冯事。即使在不支持權(quán)限自動重置的設(shè)備上焦匈,使用這些 API 也是安全的 (API 在這些設(shè)備上會返回 FEATURE_NOT_AVAILABLE)。
- 2021 年 10 月 - 跨平臺自動重置 API 可作為穩(wěn)定的 API 使用 (Jetpack Core 1.7.0)昵仅。
- 2021 年 12 月 - 權(quán)限自動重置功能將開始在由 Google Play 服務(wù)提供支持并運行 Android 6.0 到 Android 10 之間版本的設(shè)備上逐步推廣缓熟。在這些設(shè)備上,用戶可以前往自動重置設(shè)置頁面摔笤,針對特定應(yīng)用啟用/停用自動重置够滑。系統(tǒng)將在設(shè)備啟用該功能幾周后開始自動重置未使用應(yīng)用的權(quán)限。
- 2022 年第 1 季度 - 權(quán)限自動重置功能將覆蓋所有運行 Android 6.0 到 Android 10 之間版本的設(shè)備吕世。
歡迎您持續(xù)關(guān)注我們彰触,隨時獲取最新資訊。
歡迎您 點擊這里 向我們提交反饋命辖,或分享您喜歡的內(nèi)容况毅、發(fā)現(xiàn)的問題。您的反饋對我們非常重要尔艇,感謝您的支持尔许!