美文网首页
AndroidQ适配

AndroidQ适配

作者: Allenlll | 来源:发表于2019-10-10 14:52 被阅读0次

    参考: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中加上这句话
    <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_DIRECTORYSECONDARY_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

    相关文章

      网友评论

          本文标题:AndroidQ适配

          本文链接:https://www.haomeiwen.com/subject/iawgpctx.html