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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值