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