通知執行階段權限

Android 13 (API 級別 33) 以上版本支援執行階段權限,可從應用程式傳送非豁免 (包括前景服務 (FGS)) 通知:POST_NOTIFICATIONS。這項變更可協助使用者專注在他們最重視的通知上。

強烈建議您盡快指定 Android 13 以上版本,以便享有這項功能的額外控管和彈性。如果您繼續指定 12L (API 級別 32) 以下為目標,就無法在應用程式功能的情況下要求權限

宣告權限

如要從應用程式要求新的通知權限,請將應用程式更新為指定 Android 13,並完成與要求其他執行階段權限類似的程序,如下各節所示。

以下程式碼片段顯示需要在應用程式資訊清單檔案中宣告的權限:

<manifest ...>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
    <application ...>
        ...
    </application>
</manifest>

使用者在權限對話方塊中的選擇會決定應用程式功能

在這個對話方塊中,使用者可以執行下列操作:

以下各節根據使用者採取的動作,說明應用程式的行為。

使用者選取「允許」

如果使用者選取「允許」選項,應用程式就能執行以下操作:

使用者選取「不允許」

如果使用者選取「不允許」選項,除非應用程式符合豁免資格,否則無法傳送通知。除了少數特定角色外,所有通知管道都會遭到封鎖。這類似於使用者在系統設定中手動關閉應用程式的所有通知。

注意:如果應用程式指定的是 12L 以下版本,且使用者輕觸「不允許」,即便只有一次,系統也不會再次顯示提示,直到發生以下任一情況:

  • 使用者解除安裝應用程式,然後再重新安裝。
  • 您將應用程式更新為指定 Android 13 以上版本。

使用者未從對話方塊選取任何選項

如果使用者滑開對話方塊,也就是沒有選取「允許」或「不允許」,通知權限的狀態並不會改變。

對新安裝應用程式的影響

如果使用者在搭載 Android 13 以上版本的裝置上安裝應用程式,應用程式的通知功能會預設為關閉。應用程式必須等到您要求新權限,且使用者授予應用程式權限後,才能傳送通知。

顯示權限對話方塊的時機,視應用程式的目標 SDK 版本而定:

  • 如果應用程式指定 Android 13 以上版本,應用程式可完全控管權限對話方塊顯示的時機。請利用這個機會,向使用者說明應用程式需要這項權限的原因,並鼓勵他們授予權限。
  • 如果您的應用程式指定 12L (API 級別 32) 以下為目標,則系統會在您建立通知管道後首次啟動活動時,或應用程式啟動活動再建立第一個通知管道時,顯示權限對話方塊。這通常在應用程式啟動時。

對現有應用程式更新版本的影響

為了盡量減少通知權限的相關幹擾,當使用者將裝置升級至 Android 13 以上版本時,系統會自動向所有符合資格的應用程式預先授予權限。也就是說,這些應用程式可以繼續傳送通知給使用者,而使用者不會看到執行階段權限提示。

預先授予權限的資格規定

為了讓應用程式符合自動預先授予權限的資格,應用程式必須具有現有的通知管道,而且未在搭載 12L 以下版本的裝置上明確停用通知功能。

如果使用者在搭載 12L 以下版本的裝置上停用應用程式通知,當裝置升級至 Android 13 以上版本時,拒絕動作將維持不變。

豁免資格

本節包含一組不受通知權限行為變更影響的通知和應用程式。在 Android 13 (API 級別 33) 以上版本中,如果使用者拒絕通知權限,仍會在工作管理員中看到與前景服務相關的通知,但不會在通知導覽匣中看到這類通知。

媒體工作階段

媒體工作階段相關通知不受這項行為變更影響。

設定為自行管理通話的應用程式

如果應用程式設定為自行管理通話,則應用程式不需要 POST_NOTIFICATIONS 權限,就能傳送使用 Notification.CallStyle 通知樣式的通知。

如果應用程式執行下列任一操作,系統就會判定應用程式已設定為自行管理通話:

  1. 宣告 MANAGE_OWN_CALLS 權限。
  2. 實作 ConnectionService 介面。
  3. 呼叫 registerPhoneAccount(),向裝置的電信供應商註冊。

測試應用程式

您可以評估應用程式首次在搭載 Android 13 以上版本的裝置上使用時,通知權限對應用程式的影響。您可以利用下列 Android Debug Bridge (ADB) 指令集,模擬最常見的使用者選擇和裝置升級序列,而不必重設測試裝置:

  • 應用程式是新安裝在搭載 Android 13 以上版本的裝置上:

    adb shell pm revoke PACKAGE_NAME android.permission.POST_NOTIFICATIONS
    adb shell pm clear-permission-flags PACKAGE_NAME \
      android.permission.POST_NOTIFICATIONS user-set
    adb shell pm clear-permission-flags PACKAGE_NAME \
      android.permission.POST_NOTIFICATIONS user-fixed
  • 應用程式安裝在搭載 12L 以下版本的裝置上,且使用者保持啟用通知功能,之後裝置會升級至 Android 13 以上版本:

    adb shell pm grant PACKAGE_NAME android.permission.POST_NOTIFICATIONS
    adb shell pm set-permission-flags PACKAGE_NAME \
      android.permission.POST_NOTIFICATIONS user-set
    adb shell pm clear-permission-flags PACKAGE_NAME \
      android.permission.POST_NOTIFICATIONS user-fixed
  • 應用程式安裝在搭載 12L 以下版本的裝置上時,使用者手動停用通知,之後裝置會升級至 Android 13 以上版本:

    adb shell pm revoke PACKAGE_NAME android.permission.POST_NOTIFICATIONS
    adb shell pm set-permission-flags PACKAGE_NAME \
      android.permission.POST_NOTIFICATIONS user-set
    adb shell pm clear-permission-flags PACKAGE_NAME \
      android.permission.POST_NOTIFICATIONS user-fixed

最佳做法

本節說明幾種在應用程式中使用新通知權限最有效的方式。

更新應用程式的目標 SDK 版本

如要讓應用程式在權限對話方塊的顯示時機更具彈性,請將應用程式更新為指定 Android 13 以上版本。

等候顯示通知權限提示

要求使用者授予任何權限之前,請讓他們熟悉您的應用程式。

新使用者可能會想探索應用程式,親自體驗每個通知要求的優點。您可以透過使用者的動作觸發權限提示。以下列舉幾個範例,說明顯示通知權限提示的適當時機:

  • 使用者輕觸「快訊鈴鐺」按鈕。
  • 使用者選擇追蹤他人的社群媒體帳戶。
  • 使用者提交餐點外送訂單。

圖 1 顯示了要求通知權限的建議工作流程。除非 shouldShowRequestPermissionRationale() 傳回 true,否則應用程式不需要顯示中間畫面,也就是標題文字為「接收通知!」的畫面。

或者,您可以設定在使用者有機會熟悉應用程式後才顯示要求。例如,您可以等到使用者第三次或第四次啟動應用程式後才顯示。

使用者登入後,會收到接收行程更新通知的邀請。使用者按下「我現在」按鈕後,應用程式會要求新權限,並顯示系統對話方塊
圖 1 要求通知權限的建議使用者驅動工作流程。只有在 shouldShowRequestPermissionRationale() 傳回 true 時,才需要中間畫面。

在相關情境中要求權限

在應用程式中要求通知權限時,請在正確的環境中進行,以便明確瞭解通知的用途,以及使用者應選擇啟用的原因。舉例來說,電子郵件應用程式可能包含在每次有新電子郵件時,或是只對使用者是唯一收件者的電子郵件傳送通知的選項。

請善用這個機會公開說明您的意圖,這樣使用者授予應用程式通知權限的可能性就會提高。

檢查應用程式是否能傳送通知

在應用程式傳送通知前,請先確認使用者是否已啟用應用程式通知功能。如要執行此操作,請呼叫 areNotificationsEnabled()

以負責任的態度使用權限

獲準傳送通知後,請務必以負責任的態度使用這項權限。使用者可以查看應用程式每日傳送的通知數量,也可以隨時撤銷權限