#Android系统版本适配的一些坑
8.0适配
1.安装APK
Android 8.0去除了“允许未知来源”选项,所以如果我们的App有安装App的功能(检查更新之类的),那么会无法正常安装。 首先在AndroidManifest文件中添加安装未知来源应用的权限
2. 限制静态隐式广播的接收,
在AndroidManifest中注册的广播接收者, 将不能再接收到隐式广播, 系统级别,如开机等不受影响() 显式广播 Intent(只有您的应用可以响应的 Intent)在 Android 8.0 上仍以相同方式工作。 例外的隐式广播列表链接: 例外列表
<receiver android:name="com.包名.receiver.XXReceiver">
<intent-filter>
<action android:name="com.xx.action.ACTION_UPDATE" />
</intent-filter>
</receiver>
3. 透明窗体不允许设置方向, 特性?Bug?
Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
解决方案:
修改主题, 添加或修改如下属性android:windowIsTranslucent
或修改方向属性如下android:screenOrientation="behind"
, 跟随上一个页面的方向
三方库中的activity异常, 可以重写activity配置, 使用 tools:replace=”android:screenOrientation” 或tools:replace=”android:theme”, 属性修改替换的属性设置
<activity
android:name="me.weyye.hipermission.PermissionActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="behind"
android:theme="@style/CustomTheme_Dialog"
tools:replace="android:screenOrientation" />
隐式广播需要应用中进行动态注册
myReceiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(TOAST_ACTION);
registerReceiver(myReceiver, intentFilter);
9.0适配
1. 配置使用http网络
配置使用http网络, 强制http也可用
- application添加属性
android:networkSecurityConfig="@xml/network_security_config"
- 创建xml文件夹及network_security_config.xml文件.
- xml文件内容配置如下
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
2. 配置使用旧版本的http库
配置使用旧版org.apache.http.legacy
库
- 在清单文件中添加说明,使用
org.apache.http.legacy
库**
<application>
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
</application>
- 或在build文件android模块下加入
useLibrary 'org.apache.http.legacy'
配置
3. 限制非Activity场景启动Activity
限制非Activity场景启动Activity
从Android P开始,只有当Intent flag中指定了FLAG_ACTIVITY_NEW_TASK
,
才允许在非Activity场景启动Activity。如果不在Intent添加FLAG_ACTIVITY_NEW_TASK
,
将无法通过非Activity的Context启动一个Activity,并且会抛异常。
4. 前台服务需要添加权限
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
如果我们没有在AndroidManifest中注册FOREGROUND_SERVICE权限,在Service启动的时候会抛出SecurityException异常
5.ImageDecoder, 位图处理库引入
适用于可绘制对象和位图的 ImageDecoder
Android 9 引入了 ImageDecoder 类,可提供现代化的图像解码方法。 使用该类取代 BitmapFactory 和 BitmapFactory.Options API
。
ImageDecoder 让您可通过字节缓冲区、文件或 URI 来创建 Drawable 或 Bitmap。 要解码图像,请首先以编码图像的来源为参数,调用 createSource()。 然后,通过传递 ImageDecoder.Source 对象来调用 decodeDrawable() 或 decodeBitmap(),从而创建 Drawable] 或 Bitmap。 要更改默认设置,请将 OnHeaderDecodedListener 传递给 decodeDrawable() 或 decodeBitmap()。 ImageDecoder 调用 onHeaderDecoded(),以图像的默认宽度和高度(若已知)为参数。 如果编码图像是动画 GIF 或 WebP,decodeDrawable() 将返回 Drawable,它是 AnimatedImageDrawable 类的一个实例。
您可以使用不同的方法来设置图像属性:
- 要将解码的图像缩放到精确尺寸,请将目标尺寸传递给 setTargetSize()。 您也可以使用样图尺寸来缩放图像。 将样图尺寸直接传递给setTargetSampleSize()。
- 要在缩放图像的范围内裁剪图像, 调用 setCrop()。
- 要创建可变位图, setMutableRequired(true)。 通过 ImageDecoder 还可以为圆角或圆形遮罩之类的图像添加复杂的定制效果。 以 PostProcessor 类的一个实例作为参数使用 setPostProcessor(),执行您所需的任何绘图命令