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