根据华为开发者平台AppGallery目标 API等级(targetSdkVersion)重要变更要求的通知,自2018年7月18日,华为应用市场联合国内主流应用预置与分发服务提供者,作为发起单位,共同签署电信终端产业协会(TAF)发布的《移动应用软件高API等级预置与分发自律公约》。按照公约规定,自2019年5月1日起,华为应用市场新上架应用应基于Android 8.0 (API等级26,即targetSdkVersion大于等于26)及以上开发。自2019年8月1日起,现有应用的更新应基于Android 8.0 (API等级26,即targetSdkVersion大于等于26)及以上开发。
这里对本次适配过程中遇到的适配内容做一次总结。
一、自动安装更新适配
在Android 8.0以后,Google对第三方app安装apk进行了严格的限制,新增了android.permission.REQUEST_INSTALL_PACKAGES
权限,如果你的应用想要获得安装apk的权限,必须在manifest中声明此权限。 由于Android向下兼容的关系,targetSdkVersion低于26则不用关心这个,但是现在我们需要适配到26+,如果我们有应用内更新或者下载安装其他apk的需求,就必须要关注安装权限了。
<!--适配Android8.0未知来源应用安装权限--> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
二、FileUriExposedException异常适配
在targetSdkVersion升级到26之后,在读取媒体库文件(例如调用第三方应用打开PDF文件等)、安装apk的时候会出现崩溃,报错FileUriExposedException
。Google认为通过诸如file://URI
这样的URI访问文件是不安全的,特别是访问其它应用的私有目录和文件,因此很早就提供了FileProvider
这样的东西用于管理文件访问。在Android 7.0+的系统上,Android SDK的 StrictMode 不再允许在应用外部公开file://URI
,如果携带file://URI
离开自己的应用(访问PackageInstaller,访问相册 etc.),就会抛出FileUriExposedException
。
该问题有两种适配方案:
1.FileProvider适配
在res目录下新建一个xml文件夹,并且新建一个provider_paths的xml文件
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path path="." name="camera_photos" /> <external-path name="images" path="Pictures/" /> <external-path name="dcim" path="DCIM/" /> </paths> 在AndroidManifest.xml中添加如下代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
...
<application
...
<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>
</application>
</manifest>
适配