Android 13新功能及適配工作詳解
前言
目前Google已經(jīng)發(fā)布了Android13的正式版,雖然國(guó)內(nèi)的手機(jī)能用上Android13還有一段時(shí)間,不過(guò)開(kāi)發(fā)者們可以通過(guò)模擬器來(lái)體驗(yàn),那么我們來(lái)看看Android13都有哪些重要的改變,我們適配的話需要做哪些工作?
新功能和API
先來(lái)看看Android13帶來(lái)來(lái)哪些新的改變,這里我挑了一些對(duì)我們比較重要的來(lái)說(shuō)。
具體可以參考developer.android.google.cn/about/versi…
帶主題的應(yīng)用圖標(biāo)
讓應(yīng)用圖標(biāo)隨著主題換色。
首先應(yīng)用要提供自適應(yīng)圖標(biāo)和單色應(yīng)用圖標(biāo),并通過(guò)清單中的 <adaptive-icon> 元素指向該單色應(yīng)用圖標(biāo)。
然后需要用戶在系統(tǒng)設(shè)置中啟用帶主題的應(yīng)用圖標(biāo)
這樣系統(tǒng)會(huì)根據(jù)壁紙和主題來(lái)確定色調(diào)顏色,然后該顏色將應(yīng)用于單色應(yīng)用圖標(biāo)。
剪貼板預(yù)覽
從 Android 13 開(kāi)始,將內(nèi)容添加到剪貼板時(shí),我們可以預(yù)覽復(fù)制的內(nèi)容。如下
Android13也加入了對(duì)剪貼板敏感內(nèi)容的脫敏處理,后面會(huì)詳細(xì)說(shuō)。
提高了啟動(dòng)畫面效率
Android12引入了Splash Screen API,可以幫助開(kāi)發(fā)者更好的開(kāi)發(fā)啟動(dòng)頁(yè)面,我之前也專門用一篇文章介紹過(guò),不過(guò)有些地方還需要改進(jìn)。果不然Android13就進(jìn)行了完善,包括下面兩項(xiàng)改動(dòng);
- 系統(tǒng)會(huì)直接從 AnimatedVectorDrawable 推斷動(dòng)畫時(shí)長(zhǎng)。在 Android 13 之前,必須直接設(shè)置 windowSplashScreenAnimationDuration。
- 使用新的 windowSplashScreenBehavior 屬性可以更好地控制應(yīng)用是否始終在 Android 13 及更高版本中的啟動(dòng)畫面上顯示該圖標(biāo)。
廣播接收
在以前任何應(yīng)用都可以向動(dòng)態(tài)注冊(cè)的接收器發(fā)送不受保護(hù)的廣播,除非該接收器受簽名權(quán)限的保護(hù)。Android13允許用戶指定是否接受外部應(yīng)用的廣播,前提是啟用了DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED 兼容性框架(默認(rèn)是關(guān)閉的)
在注冊(cè)廣播的時(shí)候設(shè)置一個(gè)Flag,如下:
context.registerReceiver(sharedBroadcastReceiver, intentFilter, RECEIVER_EXPORTED) context.registerReceiver(privateBroadcastReceiver, intentFilter, RECEIVER_NOT_EXPORTED)
注意:如果啟用了DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED,在注冊(cè)廣播的時(shí)候就必須設(shè)置RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED。
照片選擇器
Android13提供了照片選擇器,這樣無(wú)需向應(yīng)用授予整個(gè)媒體庫(kù)的訪問(wèn)權(quán)限。
使用照片選擇器需要 1.6.0-alpha05 或更高版本的 androidx.activity 庫(kù),主要api:
- PickVisualMedia,用于選擇單張圖片或單個(gè)視頻。
- PickMultipleVisualMedia,用于選擇多張圖片或多個(gè)視頻。
示例代碼如下:
val pickMedia = registerForActivityResult(PickVisualMedia()) { uri -> if (uri != null) { Log.d("PhotoPicker", "Selected URI: $uri") } else { Log.d("PhotoPicker", "No media selected") } } pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageAndVideo)) pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageOnly)) pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.VideoOnly)) val mimeType = "image/gif" pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.SingleMimeType(mimeType)))
附近WIFI設(shè)備新權(quán)限
Android13之前針對(duì)WIFI的權(quán)限是ACCESS_FINE_LOCATION,即使我們不想定位只想查詢一下附近的wifi。Android13提供了一個(gè)新的運(yùn)行時(shí)權(quán)限NEARBY_WIFI_DEVICES來(lái)專門針對(duì)這種情況,這個(gè)權(quán)限影響的API如下:
WifiManager
- startLocalOnlyHotspot()
WifiAwareManager
- attach()
WifiAwareSession
- publish()
- subscribe()
WifiP2pManager
- addLocalService()
- connect()
- createGroup()
- discoverPeers()
- discoverServices()
- requestDeviceInfo()
- requestGroupInfo()
- requestPeers()
WifiRttManager
- startRanging()
使用以上Api需要申請(qǐng)NEARBY_WIFI_DEVICES權(quán)限。
精確鬧鐘權(quán)限
Android13提供了一個(gè)新的鬧鐘權(quán)限USE_EXACT_ALARM,它類似于SCHEDULE_EXACT_ALARM不過(guò)是自動(dòng)授權(quán)的,不需要用戶手動(dòng)授權(quán)。
Google對(duì)這個(gè)權(quán)限的要求是必須是鬧鐘、計(jì)時(shí)器或提供活動(dòng)通知的日歷應(yīng)用才可以使用,GooglePlay會(huì)對(duì)使用這個(gè)權(quán)限的應(yīng)用進(jìn)行審核。不過(guò)目前國(guó)內(nèi)還沒(méi)有限制,后續(xù)各大應(yīng)用市場(chǎng)應(yīng)該也會(huì)跟進(jìn)限制。
適配Android13
下面來(lái)看看適配Android13需要注意哪些事項(xiàng)。這里只列舉一些比較常用的功能,全部?jī)?nèi)容可以參賽developer.android.google.cn/about/versi…
通知的運(yùn)行時(shí)權(quán)限
Android 13(API 級(jí)別 33)引入了運(yùn)行時(shí)通知權(quán)限POST_NOTIFICATIONS,如果應(yīng)用以 Android 13 為目標(biāo)平臺(tái),當(dāng)需要發(fā)送通知的時(shí)候就需要?jiǎng)討B(tài)請(qǐng)求該權(quán)限,否則無(wú)法發(fā)出通知。
注意:媒體相關(guān)的通知不受這個(gè)權(quán)限的影響,依然可以正常進(jìn)行通知;前臺(tái)服務(wù)的通知?jiǎng)t受本權(quán)限影響。
可以通過(guò)NotificationManager的areNotificationsEnabled()來(lái)檢查應(yīng)用是否可以發(fā)送通知。
剪切板脫敏
上面我們提到Android13提供來(lái)剪切板預(yù)覽功能,但是如果復(fù)制的是敏感內(nèi)容的話,可以在調(diào)用 ClipboardManager#setPrimaryClip() 之前向 ClipData 的 ClipDescription 添加一個(gè)標(biāo)志,這樣預(yù)覽的時(shí)候就看不到敏感內(nèi)容了
代碼如下:
// When your app targets API level 33 or higher clipData.apply { description.extras = PersistableBundle().apply { putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true) } } // If your app targets a lower API level clipData.apply { description.extras = PersistableBundle().apply { putBoolean("android.content.extra.IS_SENSITIVE", true) } }
添加標(biāo)志后的效果如下
附近WIFI設(shè)備新權(quán)限
上面提到了,針對(duì)附近WIFI設(shè)備提供了一個(gè)新的運(yùn)行時(shí)權(quán)限NEARBY_WIFI_DEVICES。
如果應(yīng)用不會(huì)使用WIFI相關(guān)API進(jìn)行定位,那么可以將 android:usesPermissionFlags 屬性設(shè)置為 neverForLocation:
<manifest ...> <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" /> <application ...> ... </application> </manifest>
因?yàn)镹EARBY_WIFI_DEVICES只在Android13上,所以我們還要保留ACCESS_FINE_LOCATION以應(yīng)對(duì)Android12及以下設(shè)備,不過(guò)可以為其設(shè)置最高sdk版本,如下:
<manifest ...> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="32" /> <application ...> ... </application> </manifest>
細(xì)化媒體權(quán)限
如果應(yīng)用以 Android 13 為目標(biāo)平臺(tái),那么如果要訪問(wèn)媒體文件時(shí)就不能像之前那樣請(qǐng)求READ_EXTERNAL_STORAGE權(quán)限,Android 13提供了更加細(xì)化的權(quán)限,必須請(qǐng)求以下權(quán)限來(lái)代替:
媒體類型 | 請(qǐng)求權(quán)限 |
---|---|
圖片和照片 | READ_MEDIA_IMAGES |
視頻 | READ_MEDIA_VIDEO |
音頻文件 | READ_MEDIA_AUDIO |
這樣可以更加保護(hù)用戶的隱私。
如果同時(shí)請(qǐng)求 READ_MEDIA_IMAGES 權(quán)限和 READ_MEDIA_VIDEO 權(quán)限,只會(huì)顯示一個(gè)系統(tǒng)權(quán)限對(duì)話框。
注意:如果您的應(yīng)用只需要訪問(wèn)圖片、照片和視頻,請(qǐng)考慮使用 照片選擇器,而不是聲明 READ_MEDIA_IMAGES 和 READ_MEDIA_VIDEO 權(quán)限。
后臺(tái)使用身體傳感器的新權(quán)限
如果應(yīng)用以 Android 13 為目標(biāo)平臺(tái),并且在后臺(tái)運(yùn)行時(shí)需要訪問(wèn)身體傳感器信息,那么除了現(xiàn)有的 BODY_SENSORS權(quán)限外,還需要聲明新的 BODY_SENSORS_BACKGROUND權(quán)限。
總結(jié)
以上就是Android 13版本中對(duì)開(kāi)發(fā)者來(lái)說(shuō)比較關(guān)心的新功能和適配方案,如果想了解更全面的信息,可以參考官方developer.android.google.cn/about/versi…
更多關(guān)于Android 13新功能適配的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android實(shí)現(xiàn)衛(wèi)星菜單效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)衛(wèi)星菜單效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07Android使用TransitionDrawable漸變切換多張圖片
這篇文章主要為大家詳細(xì)介紹了Android使用TransitionDrawable漸變切換多張圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08Android帶圓形數(shù)字進(jìn)度的自定義進(jìn)度條示例
本篇文章主要介紹了Android帶圓形數(shù)字進(jìn)度的自定義進(jìn)度條示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02Android自定義ImageView實(shí)現(xiàn)圓角功能
這篇文章主要為大家詳細(xì)介紹了Android自定義ImageView實(shí)現(xiàn)圓角功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Android Studio使用USB真機(jī)調(diào)試詳解
這篇文章主要為大家詳細(xì)介紹了Android Studio使用USB真機(jī)調(diào)試的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Android 獲取服務(wù)器與客戶端時(shí)差的實(shí)例代碼
下面小編就為大家分享一篇Android 獲取服務(wù)器與客戶端時(shí)差的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01