android自动更新 基于okhttp

一般上线项目都需要做自动更新这个模块,写下来已作为以后的参考
1.我用的OKHttp上代码:

//初始化网络协议
 HTTPCaller.getInstance().post(CheckUpdate.class, url, null, null, requestDataCallback);
  /**
     * HTTPCaller回调方法
     * CheckUpdate 是json解析的实体类 这个根据服务端返回的数据类型建立
     */
    private RequestDataCallback<CheckUpdate> requestDataCallback = new RequestDataCallback<CheckUpdate>() {
        @Override
        public void dataCallback(CheckUpdate obj) {
            if (obj != null) {
                if (obj.data.has_new_ver) {
                //这里我自己写的服务端 给我一个是否更新的标记(当然也可以根据版本号进行判断)
                    showDialog(obj.data.version_info.download_url);
                } else {//没有新版本
                    Gson gson = new Gson();
                    gson.toJson(obj);
                
                    Toast.makeText(context, "这是最新版本", Toast.LENGTH_SHORT).show();
                }
            }
        }
    };
  /**
     * 显示更新对话框
     *
     * @param downloadUrl 下载的网址
     * 下载apk的地址是服务端返回的
     */
    private void showDialog(final String downloadUrl) {
        // 这里的属性可以一直设置,因为每次设置后返回的是一个builder对象
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        // 设置提示框的标题
        builder.setTitle("版本升级").
                setIcon(R.mipmap....). // 设置提示框的图标
                setMessage("发现新版本!请及时更新").
                setPositiveButton("确定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
           //下载最新的版本程序
               startUpload(downloadUrl);
            }
        });
        AlertDialog alertDialog = builder.create();
        // 显示对话框
        alertDialog.show();
    }
 /**
     * 开始下载
     *
     * @param downloadUrl 下载url
     */
    private void startUpload(String downloadUrl) {
//        progressDialog = new ProgressDialog(context);
//        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//        progressDialog.setMessage("正在下载新版本");
//        progressDialog.setCancelable(false);//不能手动取消下载进度对话框
        final String fileSavePath = HttpUtils.getSaveFilePath(downloadUrl);//设置自己的下载地址
        Logs.doLog("----fileSavePath-------------" + fileSavePath);
        HTTPCaller.getInstance().downloadFile(downloadUrl, fileSavePath, null, new ProgressUIListener() {
            @Override
            public void onUIProgressStart(long totalBytes) {//下载开始
                //  progressDialog.show();
                Toast.makeText(context, "正在更新...", Toast.LENGTH_SHORT).show();
            }

            //更新进度
            @Override
            public void onUIProgressChanged(long numBytes, long totalBytes, float percent, float speed) {
                // progressDialog.setProgress((int) numBytes);
            }

            @Override
            public void onUIProgressFinish() {//下载完成
                // progressDialog.dismiss();
                Toast.makeText(context, "下载完成", Toast.LENGTH_SHORT).show();
                openAPK(fileSavePath);

            }
        });
    }
 /**
     * 获取文件保存路径 sdcard根目录/download/文件名
     *设置自己的下载地址 我是直接写死的
     * @param fileUrl
     * @return
     */
    public static String getSaveFilePath(String fileUrl) {
        String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1, fileUrl.length());//获取文件名称
        Logs.doLog("----文件名字-------------" + fileName);
        String newFilePath = "/mnt/sdcard" + "/Download/" + fileName;
        Logs.doLog("----fileSavePath-------------" + newFilePath);
        return newFilePath;
    }

 /**
     * 下载完成安装apk
     *
     * @param fileSavePath 下载路径
     */
    private void openAPK(String fileSavePath) {
        File file = new File(fileSavePath);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        Uri data;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0
            // "com.highsail.chatcenter.fileprovider"即是在清单文件中配置的authorities(这里我写的是自己的包名)
            data = FileProvider.getUriForFile(context, "com.yunboai.xiaok", file);
            // 给目标应用一个临时授权
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        } else {
            data = Uri.fromFile(file);
        }
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//安装完成之后可以直接打开app,避免安装完成闪回桌面的问题
        intent.setDataAndType(data, "application/vnd.android.package-archive");
        context.startActivity(intent);
    }

代码写的很详细,也是自己留着备用的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值