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
通知樣式的通知。
如果應用程式執行下列任一操作,系統就會判定應用程式已設定為自行管理通話:
- 宣告
MANAGE_OWN_CALLS
權限。 - 實作
ConnectionService
介面。 - 呼叫
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
,否則應用程式不需要顯示中間畫面,也就是標題文字為「接收通知!」的畫面。
或者,您可以設定在使用者有機會熟悉應用程式後才顯示要求。例如,您可以等到使用者第三次或第四次啟動應用程式後才顯示。
在相關情境中要求權限
在應用程式中要求通知權限時,請在正確的環境中進行,以便明確瞭解通知的用途,以及使用者應選擇啟用的原因。舉例來說,電子郵件應用程式可能包含在每次有新電子郵件時,或是只對使用者是唯一收件者的電子郵件傳送通知的選項。
請善用這個機會公開說明您的意圖,這樣使用者授予應用程式通知權限的可能性就會提高。
檢查應用程式是否能傳送通知
在應用程式傳送通知前,請先確認使用者是否已啟用應用程式通知功能。如要執行此操作,請呼叫 areNotificationsEnabled()
。
以負責任的態度使用權限
獲準傳送通知後,請務必以負責任的態度使用這項權限。使用者可以查看應用程式每日傳送的通知數量,也可以隨時撤銷權限。