Android 111 的權限更新

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 意圖可以指定套件,將使用者導向至應用程式的特定畫面,以便管理權限。自 Android 11 起,即不支援這項功能。因此,使用者必須先選取要授予或撤銷權限的應用程式。這項變更的用意是藉由授予使用者更刻意權限,藉此保護使用者。

電話號碼

Android 11 會變更應用程式在讀取電話號碼時使用的手機相關權限。

如果應用程式指定 Android 11 以上版本,且需要存取下列清單中列出的電話號碼 API,那麼您必須要求 READ_PHONE_NUMBERS 權限,而非 READ_PHONE_STATE 權限。

如果應用程式宣告 READ_PHONE_STATE 呼叫上述清單以外的方法,則可繼續在所有 Android 版本中要求 READ_PHONE_STATE。如果您只針對先前清單中的方法使用 READ_PHONE_STATE 權限,但請更新資訊清單檔案,如下所示:

  1. 變更 READ_PHONE_STATE 的宣告,讓應用程式只在 Android 10 (API 級別 29) 以下版本中使用權限。
  2. 新增 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 中的權限變更,請參閱下列資料:

影片

運用 Android 11 最新的隱私權異動進行開發