#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也可用

  1. application添加属性 android:networkSecurityConfig="@xml/network_security_config"
  2. 创建xml文件夹及network_security_config.xml文件.
  3. xml文件内容配置如下
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

2. 配置使用旧版本的http库

配置使用旧版org.apache.http.legacy

  1. 在清单文件中添加说明,使用org.apache.http.legacy库**
<application>
       <uses-library
            android:name="org.apache.http.legacy"
            android:required="false" />
 </application>
  1. 或在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(),执行您所需的任何绘图命令