調整Android 相容於Android 13該注意哪些事項 (android 12 to android 13)

JLin
10 min readJan 3, 2023

--

為什麼要更新?

如果你要從android 12以下的App在今年相容於Android 13 (新上架app記得需要在2023/05, 已經在架上的App記得都會在2023/11強制要求更新)

如果既有APP我在當年無法更新到支援版本怎麼辦 ?

另外今年2022增加了一個條款,舊有的App如果在當年的11月無法來得及更新,可以要求延長最多5個月還是6個月的更新期,也就是當新版本發表後 (譬如2022/05發表, 通常到隔年11月會要求要更新,然後延長5個月後,等於發表後最晚有兩年的時候可以更新上)

更新到Android 13後你會遇到個幾個問題

1. 增加了通知權限 (Notification Runtime Permission)

在Android 13顯示通知訊息預設是無法取得權限的,因此就像其他的runtime permission一樣,必須透過系統詢問使用者後,才能有顯示通知的權限,但這又分為兩個情況

a. 已經裝有app但是相容 android 12裝置版本,這時候如果安裝在android 13,系統會自動在需要顯示通知的時候跳出通知權限詢問

b. 如果從android 12相容版本,升級到android 13相容版本,預設會可以拿到通知權限

c.如果全新安裝android 13版本,就一定需要顯示runtime permission的實做

不過跟其他權限有點不太一樣的地方是,就算沒有拿到權限,一樣可以執行通知的api,只是他就不會顯示在通知欄就是,但至少不會crash

而這邊有一個例外,就是android 13在通知列增加了一個Foreground Service Task Manager ,他會在通知欄下拉在下拉的最下方處,當你有前景服務宣告的時候,不管有沒有通知權限,都一律會顯示在這邊,使用者可以察覺有什麼app正在執行中,並且可以隨時終止該app

透過指令測試你的通知狀態

你也可以透過 adb來模擬各種安裝時後的狀況,而不用真的用android 版本來安裝測試各種升級狀況

透過api判斷是否可以送出通知

areNotificationsEnabled()

宣告權限

在runtime permission中有幾個情況,使用者允許,就可以繼續執行,不允許這時候可以透過api 詢問系統是否建議需要顯示使用權限原因,如果需要才說明為什麼你會需要使用該權限給使用者知道,然後讓他們在一次進行允許通知,直到使用者再次不允許之後,就不能在顯示詢問騷擾使用者了。另外有一個case就是使用者將之滑掉,這時候你會獲得isNotGranted的callback,不像是不允許的狀況,你下次還是可以繼續詢問。

2. 檔案存取權限增加更細緻的存取分類 / 寫入權限的異動

以前是為了讀寫外部空間的照片影片或者sdcard資料夾權限,但在android 10之後其實就已經沒有write_external_storage的權限了(除了你需告為legacy),因此讀取多媒體照片就已經不能使用傳統的File+路徑的方式去讀取對應的資料夾或者檔案,必須透過MediaStore、ContentResolver取得權限後進行取得,然後再Android 13中權限分的更細緻了,如果你只是要讀取照片,僅需要宣告

Manifest.permission.READ_MEDIA_IMAGES

如果是影片

Manifest.permission.READ_MEDIA_VIDEO

如果是聲音

Manifest.permission.READ_MEDIA_AUDIO

權限將變得更細緻化,不會讓明明只是圖片管理軟體,卻可以偷讀你的影片分析情況發生

相對要注意宣告的runtime permission也是需要定義此權限,並且權限會取代原本的空間儲存權限

Photo Picker

另外在android 11也增加了一個更好用的Photo Picker,可以多選單選等等,但可惜的是他只從android 11之後才能使用

至於怎麼透過ContentResolver來取得照片清單呢?可以參考官網

並且可以參考官方github,不過注意的是官方還沒有修改可以支援到android 13 ,因此必須針對permission的判斷還有compileSdk改為33,同時要注意權限宣告需要加入READ_MEDIA_IMAGES 的權限,如果要手動測試,也可以手動針對權限開關去開啟,也是可以達到測試目的

當中可以直接參考他的viewModel,跑過是可以正常執行的,並且向下相容於android 4.1的樣子 (其實mediaStore在android api 1 就存在了)

4. AD_ID的宣告

如果你的其他部分有用到firebase的AD_ID,你也必須宣告此權限,並且在填寫Google Play 上的稱明時候,必須明確的宣告才不會讓審查的時候不通過

5. 其他

non-Sdk的限制

New rumtime permission for neaby Wi-Fi devices

周圍wifi裝置的取得權限

Use of body sensors in the background requires new permission

電池的限制模式

如果使用者把你的app設定在限制模式,你會接收不到開機通知的boot-completed

--

--

JLin

台中 / JAVA / Android /Kotlin / Kotlin Native 對於Kotlin衍生的JVM等技術 Compose for web / desktop / Ktor Server,生成式AI (Gemini/OpenAI)各式應用, 都有小興趣