应用内升级主要分为两部分:下载和安装,以下按照这两部分开始讲述,文章最后会附上全代码。
文中部分xxx需要替换成对应的包名或apk名称
1. 权限配置 AndroidManifest.xml
- 权限请求
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
- provider配置,针对6.0以上系统
<application
....
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="包名.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
....
</application>
res/xml
新建一个file_paths.xml
文件(如果没有就创建文件夹再创建文件)
- 具体
external-path
和external-files-path
用法我也不是很懂[捂脸],建议直接google用法。- 我下载时的路径是
getExternalFilesDir
设置的路径,按下面的方式写没有问题。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path name="external_files_path" path="Android/data"/>
</paths>
</resources>
2. 下载Apk
配置没问题后,开始正式写代码,检查版本更新调用接口就不写了,按自己需求写,只挑重点讲述。
步骤
- 检查版本更新
- 对比版本号
/**
* 版本号比较
*
* @param version1 服务器版本号
* @param version2 当前版本号
* @return 0代表相等,1代表version1大于version2,-1代表version1小于version2
*/
private int compareVersion(String version1, String version2) {
if (version1.equals(version2)) {
return 0;
}
String[] version1Array = version1.split("\\.");
String[] version2Array = version2.split("\\.");
int index = 0;
// 获取最小长度值
int minLen = Math.min(version1Array.length, version2Array.length);
int diff = 0;
// 循环判断每位的大小
while (index < minLen
&& (diff = Integer.parseInt(version1Array[index])
- Integer.parseInt(version2Array[index])) == 0) {
index++;
}
if (diff == 0) {
// 如果位数不一致,比较多余位数
for (int i = index; i < version1Array.length; i++) {
if (Integer.parseInt(version1Array[i]) > 0) {
return 1;
}
}
for (int i = index; i < version2Array.length; i++) {
if (Integer.parseInt(version2Array[i]) > 0) {
return -1;
}
}
return 0;
} else {
return diff > 0 ? 1 : -1;
}
}
- 展示版本更新提示
- 检查权限是否开启(安装未知来源应用)
//版本判断
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//获取是否有安装未知来源应用的权限
haveInstallPermission = mContext.getPackageManager().canRequestPackageInstalls();
}
if (!haveInstallPermission) {
Toast.makeText(mContext, "请打开安装未知来源应用的权限", Toast.LENGTH_SHORT).show();
Uri packageURI = Uri.parse("package:" + mContext.getPackageName());
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
mContext.startActivityForResult(intent, requestCode);
}
// 在Activity中接收下载完成的回调
@Override
protected