如何應對 Android 12 開發中的版本差異?關鍵技巧大公開!
這篇文章將與您分享我的開發經驗,
著重於探討 Android 版本升級帶來的挑戰及解決方案。
透過分析我所遇到的問題,
希望能為您在開發過程中遇到類似問題提供一些有價值的見解。
如需看了官方改了什麼
可以直接去 Android Developer 觀看
Android 12 受影響的功能
即使開啟相機權限,
但只要使用者關閉相機存取權,
則會給一個黑屏的相機
麥克風亦是如此:參考
- 目前看到有下方code ,可去偵測系統是否支援,來給使用者做提示,目前暫時沒看到可以判斷是否開啟的API
-
如下多了一個預設icon的啟動畫面
-
這邊實測後,目前這個default splash screen無提供移除的方法
只有移除原本自定義Activity不顯示畫面但還是可跑原本週期的方法
官方也針對新的splash screen有一些規格:參考
-
調整思路:
- 將
implementation 'androidx.core:core-splashscreen:1.0.0'
加入build.gradle
這邊需注意min sdk要求為21以上
- 設定新的splash screen的Theme
windowSplashScreenBackground
為背景顏色,實測只能設定@colorwindowSplashScreenAnimatedIcon
為中間那個圓型view的icon,可設置圖片,但大小只能依照官方公佈的windowSplashScreenBrandingImage
為icon下方一小塊的背景圖片windowSplashScreenAnimationDuration
為動畫時間-
將新的SplashTheme加入
AndrodManifest.xml
-
加入初始code
SplashScreen.installSplashScreen(this)
需在super.onCreate
前splashScreen.setKeepOnScreenCondition(() -> true );
這行可以讓原本舊的activity畫面不顯示但activity週期會跑
但這個做法就是用新的官方splash,原本客製化的畫面就不顯示了,這邊各位
product owner可自行考量
- 將
-
如圖,當編譯後要安裝,則顯示如下
INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
錯誤 -
另外當使用到PendingIntent時也需加入對應flags不然會報錯:
-
解法 & Demo:
-
需在每個PendingIntent創建處加入
FLAG_IMMUTABLE
或FLAG_MUTABLE
標籤 -
以及加入最新work-runtime:
implementation 'androidx.work:work-runtime:2.7.1'
-
備註
- 這邊以Airdroid為例的話 目前Airdroid & httphelper repo分開所以其他有的地方也需修正
- 隱性PendingIntent也需修改,因implement的library內也有用到PendingIntent
如以目前
Airdroid
專案內使用到google analytics 17.0.0版,但亦出現error提示 (這種要實際跑到該段code才會知道是否有PendingIntent的error)這時候將版本升上去即可
implementation 'com.google.android.gms:play-services-analytics:18.0.1'
-
因為Chromium將這項功能移除,所以sdk變成不再支援:參考
這個目前實測在SDK 32上,還是可以在後台執行前台服務
先嘗試了在後台Service中執行StartForegroundService,不過可以正常執行,這邊會再追蹤看看
官方建議使用WorkManager 來替代執行: 參考
鬧鐘管理器 API 在Androd 12需聲明SCHEDULE_EXACT_ALARM
權限才能使用
使用registerListener()來註冊傳感監聽器來monitor sensor events時,最高採樣率限制200Hz
想用更高HZ則必需加入HIGH_SAMPLING_RATE_SENSORS
權限
在此版本上要求請求 大致位置/精確位置 權限時,
需同時請求ACCESS_FINE_LOCATION
與ACCESS_COARSE_LOCATION
,
才會顯示新的位置權限請求框
有遇到的可以注意下: 參考
Manifest.permission.BLUETOOTH_ADMIN
與Manifest.permission.ACCESS_FINE_LOCATION
來獲取搜尋附近藍芽裝置
有遇到用startDiscovery..等API來搜尋附近裝置
使用舊的權限在Target 32時,API返回fail 或部分API直接crash
可類似這樣修改:
- 舊的權限加入
android:maxSdkVersion="30"
- 根據需求宣告新的權限
BLUETOOTH_CONNECT
,BLUETOOTH_SCAN
或BLUETOOTH_ADVERTISE
- 以前runtime權限請求只要求
ACCESS_FINE_LOCATION
權限,現在分開了,得在runtime時新增上述藍芽權限請求
這裏是簡單demo如何改