前言
本篇仅介绍关于代码更新App所需要考虑的适配问题,不介绍如何下载App文件,也不介绍关于Android6.0动态权限申请的流程(apk文件存放于外部存储上,需要Manifest.permission.WRITE_EXTERNAL_STORAGE 权限)。 Android8.0添加了“未知来源的应用权限”的权限(Manifest.permission.REQUEST_INSTALL_PACKAGES)。本篇暂不做详细说明。
也就是说,本文前提:
- 该App已获取WRITE_EXTERNAL_STORAGE 和 REQUEST_INSTALL_PACKAGES 权限。 Android6.0之后的动态权限申请,小编推荐使用AndPermission,AndPermission中文文档
- apk文件已下载完成, 路径为 String mSavePath = Environment.getExternalStorageDirectory().getPath() + File.separator + “apk” + File.separator; 文件名称为 String mFileName = “test.apk”;
代码
调用apk安装工具类AppUtils.installApp(Context context, File file)1
2
3
4
5
6
7/**
* 安装APK文件
*/
private void installApk() {
File apkfile = new File(mSavePath, mFileName);
AppUtils.installApp(context, apkfile);
}
AppUtils.java
1 | public final class AppUtils { |
IntentUtils.java
1 | /** |
FileUtils.java
1 | public final class FileUtils { |
适配Android 7.0
在Android 7.0上,对文件的访问权限作出了修改,不能在使用file://格式的Uri 访问文件 ,Android 7.0提供 FileProvider,应该使用这个来获取apk地址
在res 目录下,新建一个xml 文件夹,在xml 下面创建一个文件provider_paths文件
provider_paths.xml
1 | <?xml version="1.0" encoding="utf-8"?> |
之后在清单文件中添加1
2
3
4
5
6
7
8
9<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
Android 8.0适配
Android 8.0适配请参考Android app 在线更新那点事儿(适配Android6.0、7.0、8.0)的第5段:“五、适配Android 8.0:未知来源的应用权限”。
该篇介绍了使用SDK自带的下载类DownloadManager来下载apk。
而小编这篇是借助三方框架okhttp直接下载到指定位置,故有前言中提到的第二个条件。