Android版本适配

105 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

Android 9

Apache HttpClient

从Android9开始默认情况下移除了Apache HTTP 客户端,如果应用需要继续使用,需要在AndroidManifest.xml文件中添加如下配置:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

HTTPS

从Android9开始,默认情况下不允许使用http明文传输,所以在建立网络连接时会使用 https 连接,同时进行安全认证。如果没有做适配,就会出现异常。Android提供了两种适配方式。

  1. 在AndroidManifest的application节点中设置usesCleartextTraffic=true。
<application
    android:usesCleartextTraffic="true"/>
  1. 在xml目录新建network_config.xml文件。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true"/>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">xx.xx.xx.xxx</domain>
    </domain-config>
</network-security-config>

然后再application节点配置networkSecurityConfig属性。

<application
    android:networkSecurityConfig="@xml/network_security_config"/>

启动Activity

从Android9开始我们不能直接在非 Activity 环境中(比如Service,Application)启动 Activity,系统会直接抛出异常,一般在推送跳转详情界面会出现此类问题,需要我们在跳转的Intent中添加FLAG_ACTIVITY_NEW_TASK标志。

Android 10

分区存储

在Android 10之前,只要用户授予了APP读写SD卡的权限,应用就可以在SD卡上随意创建文件,由于没有统一的管理方式,而且在应用卸载之后对应APP的文件或文件夹没有没删除,久而久之就会导致目录混乱,用户的存储空间越来越小。所以在Android10开始,引入了分区存储,它有以下特点:

  1. App访问自身内部存储空间、访问外部存储空间不需要任何权限。
  2. 外部存储空间和其他APP的目录无法通过路径直接访问。
  3. App访问共享存储空间需要使用Uri访问。

由于适配起来有些繁琐,所以我们可以在application节点中设置android:requestLegacyExternalStorage="true" 从而禁用分区存储。不过这种方式在Android被忽略,所以我们应该使用谷歌提供的api进行适配,对于公共目录下的文件,使用MediaStoreAPI进行读写。

 Uri imageUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, _id);