「Android」应用内升级,适配6.0及以上,附源码

本文详细介绍了Android应用内升级的流程,包括AndroidManifest.xml的权限配置,下载Apk的步骤,安装Apk的方法,以及遇到的"解析包异常"和"安装错误"的问题分析和解决方案。同时提供了WBVersionUpdateManager的源码分析,指导如何在Activity中正确使用。
摘要由CSDN通过智能技术生成

应用内升级主要分为两部分:下载和安装,以下按照这两部分开始讲述,文章最后会附上全代码。
文中部分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 文件(如果没有就创建文件夹再创建文件)
  1. 具体 external-pathexternal-files-path 用法我也不是很懂[捂脸],建议直接google用法。
  2. 我下载时的路径是 getExternalFilesDir 设置的路径,按下面的方式写没有问题。
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path name="external_files_path" path="Android/data"/>
    </paths>
</resources>

2. 下载Apk

配置没问题后,开始正式写代码,检查版本更新调用接口就不写了,按自己需求写,只挑重点讲述。

步骤

  1. 检查版本更新
  2. 对比版本号
/**
     * 版本号比较
     *
     * @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;
        }
    }
  1. 展示版本更新提示
  2. 检查权限是否开启(安装未知来源应用)
	//版本判断
	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 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值