Android版本适配说明
- 5.0适配
- 隐式服务启动适配:,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);
- 6.0适配
- 运行时权限申请:6.0新增权限动态申请,需要动态申请的权限为危险权限,与之对应的为正常权限,危险权限不仅需要在manifest中声明,同时需要动态申请权限,正常权限只需要在manifest中声明即可被同意
- 危险权限包含以下权限:危险权限分组,大概9组,对于组内权限,只要有一条被同意,其他的都会被同意,因此无需全部动态申请
- 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"/>
-
-
- CALENDAR:日历
-
<uses-permission android:name="android.permission.READ_CALENDAR"/> <uses-permission android:name="android.permission.WRITE_CALENDAR"/>
-
-
- CAMERA:相机
-
<uses-permission android:name="android.permission.CAMERA"/>
-
-
- 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"/>
-
-
- LOCATION:定位
-
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
-
-
- MICROPHONE:麦克风,话筒
-
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
-
-
- SENSORS:传感器
-
<uses-permission android:name="android.permission.BODY_SENSORS"/>
-
-
- 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"/>
-
-
- STORAGE:存储
-
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- 7.0适配
- 应用间共享文件:当targetSdkVersion大于等于24时,当使用file://Uri访问其他应用的私有文件回触发FileuriExposedException异常,因此需要使用FileProvider进行配置访问
- 在res/xml目录中新建一个xml文件用于存放应用需要共享的文件目录,如命名为file_paths.xml
- 应用间共享文件:当targetSdkVersion大于等于24时,当使用file://Uri访问其他应用的私有文件回触发FileuriExposedException异常,因此需要使用FileProvider进行配置访问
<?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>元素子节点的说明:
-
-
-
- <file-path>:内部存储应用私有目录下的files/目录,等同于Context.getFilesDir所获取的目录路径
- <cache-path>:内部存储应用私有目录下的cache/目录,等同意Context.getCacheDir所获取的目录路径
- <external-path>:外部存储空间根目录,等同于Environment.getExternalStorageDirextory所获取的目录路径
- <external-file-path>:外部存储空间私有目录下的files/目录,等同于Context.getExternalFilesDir(null)所获取的目录路径
- <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>
-
-
-
- authorities的命名通常为包名+FileProvider,resource为新建的共享说明的xml文件
-
- apk签名:android7.0引入新的签名方案APK Signature Scheme V2,他可以提供更快的应用安装时间和针对未授权apk文件的保护
- 解决方案:打包签名时同时勾选V1和V2两种签名方式
- org.apache不支持问题:
- 解决方案:build.gradle中的defaultConfig中添加useLibrary,如下
-
defaultConfig { useLibrary 'org.apache.http.legacy' }
-
- SharedPreferences问题:创建获取SharedPreferences不再使用MODE_WORLD_READABLE,需要修改成,ODE_PRIVATE
-
- 强制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适配
- PHONE权限组新增两个权限
- ANSWER_PHONE_CALLS:允许您的应用通过编程方式接听呼入电话。要在您的应用中处理呼入电话,您可以使用 acceptRingingCall() 函数。
- READ_PHONE_NUMBERS :权限允许您的应用读取设备中存储的电话号码。
- 安卓8.0中,为了更好的管制通知的提醒,不想一些不重要的通知打扰用户,新增了通知渠道,用户可以根据渠道来屏蔽一些不想要的通知
- 静态广播无法正常接收: Android 8.0 引入了新的广播接收器限制,因此您应该移除所有为隐式广播 Intent 注册的广播接收器;解决方案:使用动态广播代替静态广播
- PHONE权限组新增两个权限
- 9.0适配
- 限制了明文流量的网络请求,简单来说,网络请求必须使用https开头的,http的网络请求被禁止了,以下为解决方案:
- 方案1:
- Android 6.0 中引入了是否允许网络使用明文传输的配置原来默认为 true,但在 Android 9.0 中默认值改为了 false,因此将配置手动设为 true 即可解决明文传输被限制的问题
- 方案1:
- 限制了明文流量的网络请求,简单来说,网络请求必须使用https开头的,http的网络请求被禁止了,以下为解决方案:
android:usesCleartextTraffic="true"
-
-
- 方案2:
- 在res下的xml目录新建一个文件network_security_config(名字随意),内容如下:
- 方案2:
-
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
-
-
-
- 在Androidmanifest.xml中的application节点加入属性:
-
-
android:networkSecurityConfig="@xml/network_security_config"
-
- 前台服务权限:在 Android 9.0 中,应用在使用前台服务之前必须先申请 FOREGROUND_SERVICE 权限,此权限未普通权限,manifest中声明之后即可使用
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
- 10.0适配
- 后台启动Activity的限制:应用处于后台时,无法启动Activity;如启动页中延迟进入首页,期间应用推到后台,则无法启动首页;再如消息推送后,点击推送消息无法打开应用;以下未不受限制情况:
- 应用具有可见窗口,例如前台 Activity
- 应用在前台任务的返回栈中已有的 Activity
- 应用在 Recents 上现有任务的返回栈中已有的 Activity。Recents 就是我们的任务管理列表。
- 应用收到系统的 PendingIntent 通知
- 应用收到它应该在其中启动界面的系统广播。示例包括 ACTION_NEW_OUTGOING_CALL 和 SECRET_CODE_ACTION。应用可在广播发送几秒钟后启动 Activity
- 外部存储配置
- 后台启动Activity的限制:应用处于后台时,无法启动Activity;如启动页中延迟进入首页,期间应用推到后台,则无法启动首页;再如消息推送后,点击推送消息无法打开应用;以下未不受限制情况:
<application android:requestLegacyExternalStorage="true" ... >