android 版本升级

在app上面有一个版本升级的功能,我们在服务器上传了新的安装包之后,就可以点击更新版本去拿到服务器上面的新包并更新

拿到当前版本的版本号:

/**
     * 拿到versionName
     *
     * @return
     */
    public String getPackageVersionName() {
        //1.PackageManager 包的管理者对象
        PackageManager pm = getPackageManager();
        //2.获取应用的配置信息,在此处传递0获取的是基本信息(包名,版本名称,版本号)
        try {
            PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
            String versionName = packageInfo.versionName;
            return versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return "";
    }
    /**
     * 拿到versionCode
     *
     * @return
     */
    public int getPackageVersionCode() {
        //1.PackageManager 包的管理者对象
        PackageManager pm = getPackageManager();
        //2.获取应用的配置信息,在此处传递0获取的是基本信息(包名,版本名称,版本号)
        try {
            PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
            int versionCode = packageInfo.versionCode;
            return versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return 0;
    }

发送请求,拿到新版本的相关信息:

/**
     * 请求服务器拿到新的app版本的相关信息
     *
     * @param updateURL
     */
    private void getNewPackInfro(final String updateURL) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象
                    Request request = new Request.Builder()
                            .url(updateURL)//请求接口。如果需要传参拼接到接口后面。
                            .build();//创建Request 对象
                    Response response = null;
                    response = client.newCall(request).execute();//得到Response 对象
                    if (response.isSuccessful()) {
                        if (response.code() == 200) {
                            String res = null;
                            try {
                                res = response.body().string();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            checkVersion(res);
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

private void checkVersion(String res) {
        //拿到服务器返回的相关数据
        //进行版本比较是否进行升级
        System.out.println("返回的升级包数据:"+res);
        try {
            JSONObject jsonObject = new JSONObject(res);
            JSONObject dataStr=new JSONObject(jsonObject.getString("data"));
            String version=null;
            version=dataStr.getString("version");
            if(version.equals("null")){
                Toast.makeText(getBaseContext(), "当前已经是最新版本了", Toast.LENGTH_SHORT).show();
            }else{
                downloadUrl=dataStr.getString("url");
                //服务器有新版本,可供下载
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        showDialog();
                    }
                });
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

弹出是否下载新版本的提示:

 /**
     * 检查更新版本时的消息提示
     */
    private void showDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
//        builder.setTitle("是否下载新版本?");
        builder.setMessage("是否下载新版本");//设置对话框除标题外的描述内容
        builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                //下载apk,下载路径downloadUrl,考虑在何处存储 files cache() sd卡
                downloadApk();
            }
        });
        builder.setNegativeButton("稍后再说", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                //什么都不做
            }
        });
        builder.setCancelable(false);
        builder.show();

    }

显示下载安装包的进度:

/**
     * 下载新的apk文件
     */
    private void downloadApk() {
        //下载apk,并且指定放置下载文件的路径,sd卡
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            //创建一个进度条对话框,用于显示下载进度
            progressDialog = new ProgressDialog(this);
            //默认情况下对话框进度条圆形转圈的
            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressDialog.setCancelable(false);
            progressDialog.show();
            //手机的sd卡可用
            //sd卡存储文件的路径
            final String path = Environment.getExternalStorageDirectory().getPath() + File.separator + "jizhixinxi/package" + "mobilesafe.apk";
            //如何根据downloadUrl进行下载,okhttp下载
            OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(20, TimeUnit.SECONDS).readTimeout(20, TimeUnit.SECONDS).build();
            Request request = new Request.Builder().get().url(downloadUrl).build();
            okHttpClient.newCall(request).enqueue(new Callback() {

                @Override
                public void onFailure(Call call, IOException e) {
                    //请求失败
                    Toast.makeText(SystemConfigActivity.this, "下载新版本失败请稍后重试", Toast.LENGTH_SHORT).show();
                    progressDialog.dismiss();
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    //请求成功,从服务器的响应对象中获取apk,流(服务器 输入流(提供数据)  本地 输出流(写入文件))
                    ResponseBody body = response.body();
                    //告知progressDialog总进度,不变
                    progressDialog.setMax((int) body.contentLength());
                    //inputStream就是服务器把需要下载的apk以流的形式提供给客户端
                    InputStream inputStream = body.byteStream();
                    File file = new File(path);
                    FileOutputStream fos = new FileOutputStream(file);
                    byte[] bytes = new byte[1024];
                    int len = 0;
                    int temp = 0;//用于记录目前下载的到的位置
                    while ((len = inputStream.read(bytes)) != -1) {
                        //将读过的数据写入文件中
                        fos.write(bytes, 0, len);
                        //告知progressDialog在下载过程中的当前进度
                        temp += len;
                        //将当前的下载位置,设置给progressDialog
                        progressDialog.setProgress(temp);
                        //没下载一段数据,睡眠一段时间
                        try {
                            Thread.sleep(1);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    //一旦循环结束,则sd卡中就有一个从服务器下载下来的apk
                    //下载完成后,则隐藏对话框
                    progressDialog.dismiss();
                    //安装apk,这个要装的apk在哪里
                    installApk(file);
                }
            });
        }
    }

让系统帮我们安装:

 /**
     * 安装指定路径下的apk
     *
     * @param file 需要安装文件的路径
     */
    private void installApk(File file) {
        //找到系统的安装界面,把安装过程中要用到的东西传递进去,让系统帮助我们安装.
        Intent intent = new Intent("android.intent.action.VIEW");
        intent.addCategory("android.intent.category.DEFAULT");
        intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
        //通过隐式意图开启系统的安装apk界面
        startActivity(intent);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值