AndroidQ适配

参考:1、https://developer.huawei.com/consumer/cn/doc/50127

2、https://mp.weixin.qq.com/s?__biz=MzIxNjc0ODExMA==&mid=2247486384&idx=1&sn=96cc31ac17d17f988d3b8d101a7a5578&scene=21#wechat_redirect

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_DIRECTORYSECONDARY_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权限,可以后台使用定位
    如果应用只前台授权,从后台进入前台定位服务时,需要设置

    ...

  • 应用安装
    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

你可能感兴趣的:(AndroidQ适配)