通知執行階段權限

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()

以負責任的態度使用權限

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