Android版本更新功能

时间:2021-06-26 14:49:57
    APP都涉及到版本更新,这里我说一下思路,以及提供伪代码(从我项目里面直接拷贝出来的,
你们直接用,是用不了的)。
    思路就是:拿后台的接口,返回给你一个字段,是服务器上面的apk的版本号(每次把新版本
apk上传到公司服务器,都要把对应的版本号字段修改,写死的),跟你本地的apk版本号比较,
大于就提示用户更新下载。这里就涉及到下载功能,现在基本上都是okgo,反正我用的okgo。
涉及到下载就涉及到存储功能,android6.0以上都要动态给权限,前面有一篇就是说动态获取
权限的,不懂的可以看一下。
    1、首先获取权限,本地的版本号
// 要申请的权限
        String[] permission = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
        String title = "存储权限不可用";
        String content = "由于版本更新功能需要获取存储空间,为你存储新版本;\n否则,您将无法正常使用版本更新功能";
        initPermission(permission, title, content);
        String currentApkVerson = getCurrentApkVerson();//获取当前版本号
        currentVersonCode = Float.valueOf(currentApkVerson);//转换成float类型
    2、获取服务器的版本号,也要转换成float类型,进行比较,大于本地的版本号
就弹出对话框提示用户,有新版本需要更新。
    3、然后就是拿到链接下载APK
/** * 下载apk */

    private void downLoadApk(String apkUrl) {
        if (TextUtils.isEmpty(apkUrl)) {
            Utils.ShowToast(context, "更新失败!");
            return;
        }
        okDownload = OkDownload.getInstance();
// String path = Environment.getDataDirectory() + "/data/" + getPackageName() + "/download/";
// okDownload.setFolder(path);
        okDownload.getThreadPool().setCorePoolSize(1);
        okDownload.addOnAllTaskEndListener(this);
        okDownload.removeAll(true);//true表示删除线程的同时删除本地文件,false表示只删除线程
        okDownload.removeTask("task");//根据task删除线程
        GetRequest<File> getRequest = OkGo.<File>get(apkUrl);
        downloadTask = OkDownload.request(downLoadApkTag, getRequest)
                .priority(0)
                .fileName("name.apk")
                .register(new downloadListener(downLoadApkTag));
        downloadTask.start();
    }
    4、跳转安装界面(copy可以直接用):
    /** * 安装apk */
    private void installApk(String apkPath) {
        File apkFile = new File(apkPath);
        if (!apkFile.exists()) {
            return;
        }
        Intent intent = new Intent(Intent.ACTION_VIEW);
        //判断是否是AndroidN以及更高的版本
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            //第二个参数要与清单文件里面配置的相同,provider的authorities
            Uri contentUri = FileProvider.getUriForFile(context, "com.xinggui.wz.chuangjiaoplatform.provider", apkFile);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
        startActivity(intent);
        finish();
    }