天天看點

android版本适配 q,AndroidQ适配

1、必需支援64位

armeabi-v7a--->arm64-v8a

x86--->x86_64

2、TargetSDKVersion要求

targetSdkVersion>=28

更新sdk版本後需要适配的變化:

1、非SDK接口的管理

2、内聯方法不允許跨dex

This must be due to duplicate classes or playing wrongly with class loaders;

避免使用不同的classloader加載互相調用的類

避免内聯

3、ApacheHttp用戶端棄用

如果要使用,Androidmanifest中加上這句話

4、前台服務,必須請求FOREGROUND_SERVICE權限

其它補充

android6.0增加了運作時權限

android7.0檔案共享需要FileProvider

3、并發錄音

p版本錄音焦點不可搶占,q錄音焦點可搶占

可能導緻錄音焦點被搶占,錄音為空

4、非SDK接口的影響

非SDK接口變動頻繁,帶來相容性問題

灰:targetSDK>=28,警告

淺灰:targetSDK>=28,不允許

深灰:targetSDK>=29,不允許

黑:所有不允許

名單類型在變化,Q中黑名單有增加有删除

使用veridex工具查找應用中非sdk接口

5、檔案存儲

存儲空間的變化

Q中每個應用外部存儲有一個沙箱

有個共享集合目錄,應用解除安裝後不會删除

應用讀取自己沙箱以及共享目錄中自己檔案,不需要申請權限

應用讀取共享目錄中其它應用檔案,需要分别申請權限:READ_MEDIA_IMAGES、READ_MEDIA_AUDIO和READ_MEDIA_VIDEO

應用讀取共享目錄其它應用生成的檔案,需要通過MediaProvider來讀,沒有寫權限

應用讀取共享目錄其它應用下載下傳檔案,需要SAF方式讀取,存儲通路架構,android5.0。ContentProfider方式

檔案共享适配

1、AndroidManifest檔案中指定應用的FileProvider

2、指定共享的路徑xml檔案

3、根據權限擷取檔案的ContentUri

4、授權臨時讀寫權限intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

5、通過Intent打開檔案,選擇要分享的應用。

接收檔案

1、AndroidManifest增加intent過濾

2、接收Intent資料,得到圖檔FileDescripter,讀取圖檔

權限适配

1、uses-permission聲明新老權限

2、代碼中根據apiLevel來區分,申請不同的權限

private void requestPermission() {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {

} else {

// request old storage permission

}

}

多媒體檔案和下載下傳檔案讀取

1、讀取接口

MediaStore.Images

MediaStore.Video

MediaStore.Audio

MediaStore.Downloads

2、通過ContentProvider查詢Uri

3、根據Uri擷取Bitmap等

MediaProvider中的“_data”字段已經廢棄掉,無法通過它讀取檔案路徑

多媒體檔案的儲存

1、應用儲存到沙箱外,此方法隻能插入圖檔

MediaStore.Images.Media.insertImage

MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmap, title, discription);

2、通過ContentResolver的insert方法将多媒體檔案儲存到多媒體的公共集合目錄

3、PRIMARY_DIRECTORY和SECONDARY_DIRECTORY字段來設定一級目錄和二級目錄,不設定時,使用預設一級和二級目錄

4、應用對其它應用的檔案沒有寫權限,隻有讀權限

修改其它應用的檔案

1、使自己應用作為系統應用

2、ContentResolver修改,捕獲異常後請求使用者授權

讀取和修改所有檔案

1、通過Intent傳入ACTION_OPEN_DOCUMENT拉起DocumentUI,

在OnActivityResult中擷取選擇的檔案URI

2、使用者對檔案的通路授權,裝置重新開機後失效,可以本地儲存,

沙箱目錄中的檔案删除

1、把不希望删除的檔案通過MediaProvider或者SAF的接口儲存在公共集合目錄下面

2、在應用的AndroidManifest.xml檔案增加:會提示使用者是否删除

6、隐私與安全

擷取裝置識别碼,IMEI或者序列号等,需要READ_PRIVILEGED_PHONE_STATE權限,并且隻有系統應用才能申請,第三方應用不同申請

targetSDK>=Q,擷取DeviceId會拋出異常

可以使用AndroidID替換DeviceId

Settings.System.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);

手機恢複出廠設定,androdID重置,而deviceId不會重置

應用密鑰,使用者,裝置,三者确定androidId,不同使用者,不同androidID

mac位址随機,連接配接不同wifi,不同mac位址

禁止背景啟動Activity

鬧鐘鎖屏應用會有影響,建議改成全屏通知的樣式

地理位置權限

Q之前隻有ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION

此兩種隻有前台時可以使用,Q增加ACCESS_BACKGROUND_LOCATION權限,可以背景使用定位

如果應用隻前台授權,從背景進入前台定位服務時,需要設定

android:name="MyNavigationService"

android:foregroundServiceType="location" ... >

...

應用安裝

Q版本禁止應用通過file:// URI拉起系統安裝器進行應用安裝

1、需要申請android.permission.REQUEST_INSTALL_PACKAGES權限。

2、通過FileProvider安裝

Uri installUri = FileProvider.getUriForFile(getApplicationContext(), "com.huawei.qappcompatissues.fileprovider", apkFile);

Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE).setData(installUri);

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

startActivity(intent);

通路相機資訊需要權限

getCameraCharacteristics()如果沒有相機權限,有些字段通路可能擷取到空值

wifi開關

在Android Q上運作的應用無法通過WifiManager.setWifiEnabled()接口啟用或停用Wi-Fi,可以提供面闆,讓使用者跳轉到系統設定界面

電話,wifi,藍牙資訊需要位置權限

具有ACCESS_FINE_LOCATION才可以

wifi網絡清單手動配置被限制

getConfiguredNetworks()方法始終傳回一個空清單

系統輸入法,或者目前焦點程式才能擷取系統剪切版

MediaStore

系統的一個多媒體資料庫,通過ContentResolver來操作。

MediaStore.Fils,MediaStore.Image,MediaStore.Video,MediaStore.Audio.每個類中都有Media,Thumnails,MediaColums