Android 11 可讓使用者為位置資訊、麥克風和相機指定更精細的權限。此外,如果應用程式指定 Android 11 以上版本,系統會重設未使用應用程式的權限。如果應用程式使用系統警示視窗或讀取電話號碼相關資訊,可能需要更新所宣告的權限。
單次授權
從 Android 11 開始,每次應用程式要求位置資訊、麥克風或相機的相關權限時,向使用者顯示的權限對話方塊就會包含稱為「僅允許這一次」的選項。如果使用者在對話方塊中選取這個選項,您的應用程式就會獲得暫時的單次授權。
進一步瞭解系統如何處理一次性權限。
針對未使用的應用程式自動重設權限
如果您的應用程式指定的是 Android 11 以上版本,而且未使用的期間長達幾個月,系統會自動重設使用者已授予應用程式的機密執行階段權限,藉此保護使用者資料。這項操作的效果等同於使用者在系統設定中檢視權限,並將應用程式的存取層級變更為「拒絕」。如果應用程式遵循在執行階段要求權限的最佳做法,則無須進行任何變更。這是因為當使用者與應用程式中的功能互動時,您應確認這些功能是否具備所需權限。
也就是在提出要求時,會向使用者顯示執行階段提示的權限。進一步瞭解系統如何自動重設未使用應用程式的權限。
權限對話方塊顯示狀態
從 Android 11 開始,如果使用者在裝置上安裝應用程式後不限時間內,不止一次針對特定權限要求輕觸「拒絕」,則當您的應用程式再次要求該權限時,使用者就不會看到系統權限對話方塊。使用者的動作暗示著「不要再詢問」。在先前的版本中,除非使用者之前曾經勾選「不要再詢問」核取方塊或選項,否則應用程式每次要求權限時,使用者都會看到系統權限對話方塊。Android 11 的這項行為變更,可避免系統重複要求使用者拒絕授予的權限。
使用者可能會永久拒絕授予應用程式權限,如要確認是否如此 (出於偵錯和測試目的),請使用下列指令:
adb shell dumpsys package PACKAGE_NAME
其中 PACKAGE_NAME 是要檢查的套件名稱。
您可以在指令輸出內容中看到類似下方的區段:
... runtime permissions: android.permission.POST_NOTIFICATIONS: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED] android.permission.ACCESS_FINE_LOCATION: granted=false, flags=[ USER_SET|USER_FIXED|USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED] android.permission.BLUETOOTH_CONNECT: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED] ...
遭使用者拒絕一次的權限會標記 USER_SET
。如果是遭使用者選取「拒絕」兩次,表明要永久拒絕的權限,則會標記 USER_FIXED
。
測試期間,您可能需要重設這些標記,確保測試人員不會因為要求對話方塊未顯示而感到意外。如要這麼做,請使用下列指令:
adb shell pm clear-permission-flags PACKAGE_NAME PERMISSION_NAME user-set user-fixed
PERMISSION_NAME 是您要重設的權限名稱。如要查看 Android 應用程式權限的完整清單,請參閱權限 API 參考資料頁面。
進一步瞭解如何在應用程式中處理權限要求遭拒的情況。
系統快訊視窗變更
Android 11 對應用程式取得SYSTEM_ALERT_WINDOW
權限的方式進行了幾項變更。這項異動的目的是為了保護使用者,讓他們在授予權限時更加謹慎。
部分應用程式會在要求時自動取得 SYSTEM_ALERT_WINDOW 權限
系統會在應用程式要求時,自動授予特定類別的應用程式 SYSTEM_ALERT_WINDOW
權限:
只要應用程式具有
ROLE_CALL_SCREENING
並要求SYSTEM_ALERT_WINDOW
,系統就會自動授予權限。如果應用程式失去ROLE_CALL_SCREENING
,就會失去權限。如果應用程式透過
MediaProjection
擷取畫面並要求SYSTEM_ALERT_WINDOW
,系統會自動授予權限,除非使用者明確拒絕授予應用程式權限。應用程式停止擷取畫面時,就會失去權限。這個用途主要適用於遊戲直播應用程式。
這類應用程式不需要傳送 ACTION_MANAGE_OVERLAY_PERMISSION
即可取得 SYSTEM_ALERT_WINDOW
權限,可以直接要求 SYSTEM_ALERT_WINDOW
。
MANAGE_OVERLAY_PERMISSION 意圖一律會將使用者帶往系統權限畫面
從 Android 11 開始,ACTION_MANAGE_OVERLAY_PERMISSION
意圖一律會將使用者帶往頂層的「設定」畫面,使用者可以在該畫面中授予或撤銷應用程式的SYSTEM_ALERT_WINDOW
權限。系統會忽略意圖中的所有 package:
資料。
在舊版 Android 中,ACTION_MANAGE_OVERLAY_PERMISSION
intent 可以指定套件,將使用者帶往應用程式專屬的權限管理畫面。Android 11 不支援這項功能。使用者必須先選取要授予或撤銷權限的應用程式,這項異動的目的是為了保護使用者,讓權限授予行為更加審慎。
電話號碼
Android 11 變更了應用程式讀取電話號碼時使用的電話相關權限。
如果應用程式指定 Android 11 以上版本為目標,且需要存取下列電話號碼 API,請要求 READ_PHONE_NUMBERS
權限,而非 READ_PHONE_STATE
權限。
TelephonyManager
和TelecomManager
類別中的getLine1Number()
方法。TelephonyManager
類別中不支援的getMsisdn()
方法。
如果您的應用程式宣告 READ_PHONE_STATE
呼叫前述清單以外的方法,您可以在所有 Android 版本中繼續要求 READ_PHONE_STATE
。不過,如果您只將 READ_PHONE_STATE
權限用於上述清單中的方法,請按照下列方式更新資訊清單檔案:
- 變更
READ_PHONE_STATE
的宣告,讓應用程式只在 Android 10 (API 級別 29) 以下版本使用這項權限。 - 新增
READ_PHONE_NUMBERS
權限。
下列資訊清單宣告程式碼片段示範了這個程序:
<manifest> <!-- Grants the READ_PHONE_STATE permission only on devices that run Android 10 (API level 29) and lower. --> <uses-permission android:name="android.permission.READ_PHONE_STATE" android:maxSdkVersion="29" /> <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" /> </manifest>
其他資源
如要進一步瞭解 Android 11 的權限變更,請參閱下列資料: