app在线更新是一个比较常见需求,新版本发布时,用户进入我们的app,就会弹出更新提示框,第一时间更新新版本app。在线更新分为以下几个步骤:
- 通过接口获取线上版本号,versionCode
- 比较线上的versionCode 和本地的versionCode,弹出更新窗口
- 下载APK文件(文件下载)
- 安装APK
在后2个步骤,而由于Android 各个版本对权限和隐私的收归和保护,因此,会出现各种的适配问题,因此本文就总结一下app 在线更新方法和遇到的一些适配问题。
File apkFile = new File(saveFileFullName);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
uri = Uri.fromFile(apkFile);//file:///storage/emulated/0/temp.apk
intent.setDataAndType(uri, "application/vnd.android.package-archive");
startActivity(intent);
在6.0及以下版本,可以正常安装,但是在7.0及以上版本会报错。
android各版本新增限制
- Android 7.0:对文件的访问权限作出了修改,不能在使用file://格式的Uri 访问文件 ,Android 7.0提供FileProvider,应该使用这个来获取apk地址,然后安装apk。如下进行简单的适配:
- Android 8.0:未知来源的应用是不可以通过代码来执行安装的(在sd卡中找找到apk,手动安装是可以的),未知应用安装权限的开关被除掉,取而代之的是未知来源应用的管理列表,需要列表里面开启你的应用的未知来源的安装权限。Google这么做是为了防止一开始正经的应用后来开始通过升级来做一些不合法的事情,侵犯用户权益。
适配Android 7.0
(1)在res 目录下,新建一个xml 文件夹,在xml 下面创建一个文件provider_paths文件
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="external"
path="" />
<external-files-path
name="Download"
path="" />
</paths>
name可以任意取
(2)在AndroidManifest.xml清单文件中申明Provider:
<!APK下载保存路径-->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="packgeName.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
(3)Android 7.0上的文件地址获取:
uri = FileProvider.getUriForFile(context,
"packageNam.fileProvider",