Android中有一个进度对话框ProgressDialog,可以实现等待进度和具有具体数值进度的显示。这里我用的okhttp3来发送请求实现在线下载。
先上效果图:
ProgressDialog相关常用方法:
- setTitle:设置对话框的标题文本。
- setMessage:这是对话框的消息内容。
- setIcon:设置对话框的图标。
- setProgress:设置当前进度的数值。
- setSecondaryProgress:设置当前第二进度的数值。
- setMax:设置进度条的最大进度数值。
- setProgressStyle:设置进度条的样式。取值ProgressDialog.STYLE_SPINNER表示转圈风格(默认值),取值ProgressDialog.STYLE_HORIZONTAL表示长条风格。
- show:显示对话框。需要在各属性设置完成后调用show方法。
- isShowing:判断对话框是否正在显示。
- dismiss:关闭对话框
- 静态的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();
}