參考:1、https://developer.huawei.com/consumer/cn/doc/50127
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中加上這句話
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
4、前臺服務,必須請求FOREGROUND_SERVICE權限
<uses-permission android:name="android.permission.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) {
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
} 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文件增加:<application android:hasFragileUserData="true" />會提示用戶是否刪除
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權限,可以后臺使用定位
如果應用只前臺授權,從后臺進入前臺定位服務時,需要設置
<service
android:name="MyNavigationService"
android:foregroundServiceType="location" ... >
...
</service>
- 應用安裝
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