Android版本适配

 

Android版本适配说明

  1. 5.0适配
    1. 隐式服务启动适配:,5.0以上service不能使用隐式intent启动

Intent intent = new Intent("com.gnss.GNSSService"); intent.setAction(GPSBOARDCONTROL);//Service能够匹配的Action intent.setPackage("com.gnss.ssserver");//应用的包名 context.bindService(intent,serviceConnection, Context.BIND_AUTO_CREATE);

  1. 6.0适配
    1. 运行时权限申请:6.0新增权限动态申请,需要动态申请的权限为危险权限,与之对应的为正常权限,危险权限不仅需要在manifest中声明,同时需要动态申请权限,正常权限只需要在manifest中声明即可被同意
    2. 危险权限包含以下权限:危险权限分组,大概9组,对于组内权限,只要有一条被同意,其他的都会被同意,因此无需全部动态申请
      1. PHONE:电话

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>  <uses-permission android:name="android.permission.CALL_PHONE"/>  <uses-permission android:name="android.permission.READ_CALL_LOG"/>  <uses-permission android:name="android.permission.ADD_VOICEMAIL"/>  <uses-permission android:name="android.permission.WRITE_CALL_LOG"/>  <uses-permission android:name="android.permission.USE_SIP"/>  <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

      1. CALENDAR:日历

<uses-permission android:name="android.permission.READ_CALENDAR"/>  <uses-permission android:name="android.permission.WRITE_CALENDAR"/>

      1. CAMERA:相机

<uses-permission android:name="android.permission.CAMERA"/>

      1. CONTACTS:联系人

<uses-permission android:name="android.permission.READ_CONTACTS"/>  <uses-permission android:name="android.permission.WRITE_CONTACTS"/>  <uses-permission android:name="android.permission.GET_ACCOUNTS"/> 

      1. LOCATION:定位

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 

      1. MICROPHONE:麦克风,话筒

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

      1. SENSORS:传感器

<uses-permission android:name="android.permission.BODY_SENSORS"/>

      1. SMS:短信

<uses-permission android:name="android.permission.SEND_SMS"/>  <uses-permission android:name="android.permission.RECEIVE_SMS"/>  <uses-permission android:name="android.permission.READ_SMS"/>  <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH"/>  <uses-permission android:name="android.permission.RECEIVE_MMS"/>

      1. STORAGE:存储

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

  1. 7.0适配
    1. 应用间共享文件:当targetSdkVersion大于等于24时,当使用file://Uri访问其他应用的私有文件回触发FileuriExposedException异常,因此需要使用FileProvider进行配置访问
      1. 在res/xml目录中新建一个xml文件用于存放应用需要共享的文件目录,如命名为file_paths.xml

<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="my_images" path="./images/"/> </paths>

目录以及配置说明:name为自定义的别名,path为共享的目录,这里的path值表示共享外部私有目录file/images下的文件,如果为".",则表示共享外部私有目录下的file/目录下的所有文件,下面为<paths>元素子节点的说明:

        1. <file-path>:内部存储应用私有目录下的files/目录,等同于Context.getFilesDir所获取的目录路径
        2. <cache-path>:内部存储应用私有目录下的cache/目录,等同意Context.getCacheDir所获取的目录路径
        3. <external-path>:外部存储空间根目录,等同于Environment.getExternalStorageDirextory所获取的目录路径
        4. <external-file-path>:外部存储空间私有目录下的files/目录,等同于Context.getExternalFilesDir(null)所获取的目录路径
        5. <external-cache-path>:外部存储空间私有目录下的cache/目录,等同于Context.getExternalCacheDir()所获取的目录路径
      • 声明FileProvider:在manifest中进行声明

<provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.FileProvider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>

        1. authorities的命名通常为包名+FileProvider,resource为新建的共享说明的xml文件
    • apk签名:android7.0引入新的签名方案APK Signature Scheme V2,他可以提供更快的应用安装时间和针对未授权apk文件的保护
      1. 解决方案:打包签名时同时勾选V1和V2两种签名方式
    • org.apache不支持问题:
      1. 解决方案:build.gradle中的defaultConfig中添加useLibrary,如下

defaultConfig {          useLibrary 'org.apache.http.legacy'      } 

    1. SharedPreferences问题:创建获取SharedPreferences不再使用MODE_WORLD_READABLE,需要修改成,ODE_PRIVATE
    1. 强制FLAG_ACTIVITY_NEW_TASK 要求:在 Android 7.0(API 级别 24)之前,若开发者需要通过非 Activity context 启动 Activity,就必须设置 Intent 标志 FLAG_ACTIVITY_NEW_TASK,否则会启动失败并抛出以下异常,但这个要求在更新 Android 7.0 以后由于系统问题被临时取消了,开发者即使不设置标志也可以正常启动 Activity。而在 Android 9.0 中官方修复了这个问题,这个要求重新开始强制执行,因此开发者在适配 Android 9.0 时需要注意这个问题
  • 8.0适配
    1. PHONE权限组新增两个权限
      1. ANSWER_PHONE_CALLS:允许您的应用通过编程方式接听呼入电话。要在您的应用中处理呼入电话,您可以使用 acceptRingingCall() 函数。
      2. READ_PHONE_NUMBERS :权限允许您的应用读取设备中存储的电话号码。
    2. 安卓8.0中,为了更好的管制通知的提醒,不想一些不重要的通知打扰用户,新增了通知渠道,用户可以根据渠道来屏蔽一些不想要的通知
    3. 静态广播无法正常接收: Android 8.0 引入了新的广播接收器限制,因此您应该移除所有为隐式广播 Intent 注册的广播接收器;解决方案:使用动态广播代替静态广播
  • 9.0适配
    1. 限制了明文流量的网络请求,简单来说,网络请求必须使用https开头的,http的网络请求被禁止了,以下为解决方案:
      1. 方案1:
        1. Android 6.0 中引入了是否允许网络使用明文传输的配置原来默认为 true,但在 Android 9.0 中默认值改为了 false,因此将配置手动设为 true 即可解决明文传输被限制的问题

android:usesCleartextTraffic="true"

      1. 方案2:
        1. 在res下的xml目录新建一个文件network_security_config(名字随意),内容如下:

<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>

        1. 在Androidmanifest.xml中的application节点加入属性:

android:networkSecurityConfig="@xml/network_security_config"

    1. 前台服务权限:在 Android 9.0 中,应用在使用前台服务之前必须先申请 FOREGROUND_SERVICE 权限,此权限未普通权限,manifest中声明之后即可使用

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

  1. 10.0适配
    1. 后台启动Activity的限制:应用处于后台时,无法启动Activity;如启动页中延迟进入首页,期间应用推到后台,则无法启动首页;再如消息推送后,点击推送消息无法打开应用;以下未不受限制情况:
      1. 应用具有可见窗口,例如前台 Activity
      2. 应用在前台任务的返回栈中已有的 Activity
      3. 应用在 Recents 上现有任务的返回栈中已有的 Activity。Recents 就是我们的任务管理列表。
      4. 应用收到系统的 PendingIntent 通知
      5. 应用收到它应该在其中启动界面的系统广播。示例包括 ACTION_NEW_OUTGOING_CALL 和 SECRET_CODE_ACTION。应用可在广播发送几秒钟后启动 Activity
    2. 外部存储配置

<application android:requestLegacyExternalStorage="true" ... >

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值