Android实现显示进度条下载APP

Android中有一个进度对话框ProgressDialog,可以实现等待进度和具有具体数值进度的显示。这里我用的okhttp3来发送请求实现在线下载。

先上效果图:

81cdfbe0d36a4753b81705e43d1b2d1b.gif

ProgressDialog相关常用方法:

  1. setTitle:设置对话框的标题文本。
  2. setMessage:这是对话框的消息内容。
  3. setIcon:设置对话框的图标。
  4. setProgress:设置当前进度的数值。
  5. setSecondaryProgress:设置当前第二进度的数值。
  6. setMax:设置进度条的最大进度数值。
  7. setProgressStyle:设置进度条的样式。取值ProgressDialog.STYLE_SPINNER表示转圈风格(默认值),取值ProgressDialog.STYLE_HORIZONTAL表示长条风格。
  8. show:显示对话框。需要在各属性设置完成后调用show方法。
  9. isShowing:判断对话框是否正在显示。
  10. dismiss:关闭对话框
  11. 静态的show方法:简化的调用方法,一句代码就搞定进度对话框的设置与显示。可同时指定标题文字和消息内容,进度条样式为默认的转圈。

权限检查工具类:

public class PermissionUtil {

    public static Boolean checkPermission(Activity activity, String[] permissions, int requestCode) {
        //如果Android版本大于6.0
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            for (String permission : permissions) {
                int check = ContextCompat.checkSelfPermission(activity, permission);
                //未开启权限则请求系统弹窗,让用户选择是否立即开启弹窗
                if (check != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(activity, permissions, requestCode);
                    return false;
                }
            }
        }
        return true;
    }

    //检查权限结果数组,返回true代表都获得权限,false代表不都获取权限
    public static boolean checkGrant(int[] grantResults) {
        if (grantResults != null) {
            for (int grantResult : grantResults) {
                if (grantResult != PackageManager.PERMISSION_GRANTED)
                    return false;
            }
            return true;

        }

        return false;
    }
}

 

apk下载进度条的弹窗代码:

private void downloadAPK() {
        progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("提示");
        progressDialog.setMessage("\n正在下载安装包,请勿退出");
        progressDialog.setMax(100);
        progressDialog.setProgress(0);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        //按返回键不可取消
        progressDialog.setOnKeyListener((dialog, keyCode, event) -> keyCode == KeyEvent.KEYCODE_BACK);
        //点击区域外不可取消
        progressDialog.setCancelable(false);
        progressDialog.create();
        progressDialog.show();

        int REQUEST_CODE_CONTACT = 101;
        String[] permissions = {
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS
        };
        //验证是否许可权限

        if (!PermissionUtil.checkPermission(this, permissions, REQUEST_CODE_CONTACT)) {

            //这里就是权限打开之后自己要操作的逻辑,发请求
            OkHttpClient client = new OkHttpClient.Builder().proxy(Proxy.NO_PROXY).build();
            Request request = new Request.Builder().get().url(这里填apk的下载地址).build();
            client.newCall(request).enqueue(this);
        }

    }

 

okhttp3 onResponse()方法代码:

    @Override
    public void onResponse(Call call, Response response) throws IOException {          
              //保存文件的本地路径
            String fileSavePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/";

            ResponseBody responseBody = response.body();
            //总长度
            long length = responseBody.contentLength();

            InputStream is = responseBody.byteStream();

            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                File dir = new File(fileSavePath);
                if (!dir.exists()) {
                    dir.mkdirs();
                }
            }

            File apkFile = new File(fileSavePath, 自己的apk的名称.apk);
            if (apkFile.exists()) {
                apkFile.deleteOnExit();
            }
            FileOutputStream fos = new FileOutputStream(apkFile);

            int count = 0;
            byte[] buffer = new byte[1024];
            int numread;

            while ((numread = is.read(buffer)) != -1) {
                count += numread;
                // 计算进度条当前位置
                // 更新进度条
                progressDialog.setProgress((int) (((float) count / length) * 100));

                fos.write(buffer, 0, numread);
            }
            
            fos.close();
            is.close();
}

 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.鱼子酱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值