欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android版本更新功能

程序员文章站 2022-05-19 22:08:59
...
    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();
    }
相关标签: android