特点:支持多任务下载、多界面管理、可断点下载
使用步骤:
1、在app下的build.gradle中加入
implementation 'com.github.Dpuntu:android-downloader:v1.0.0'
2、在Application中初始化下载器
DownloadManager.initDownloader(this);
3、配置Downloader,加入任务列表,开始下载任务
List<Downloader> downloaders= new ArrayList<Downloader>();
OkHttpClient client= new OkHttpClient.Builder().build();
Downloader downloader= new Downloader.Builder()
.client(client)
.fileName("android" + idtask + ".apk") //下载的文件存储在文件夹中的名称
.filePath(Environment.getExternalStorageDirectory().getPath() + "/downFile") //文件存储路径
.taskId("tashid") //该任务的唯一标识,任务id
.url(idtask) //文件下载地址
.build();
downloaders.add(downloader);
DownloadManager.addDownloader(downloaders);
DownloadManager.start(idtask);
4、下载情况监听
DownloadManager.subjectTask(idtask, new DownloadObserver(downlaodProgressBar, openOrDownloadBtn));
//idtask任务唯一标识 DownloadObserver如下,两个参数分别是进度条及按钮控件,显示进度及当前状态
private class DownloadObserver implements Observer {
private ProgressBar mTextView;
private TextView textView;
public DownloadObserver(ProgressBar textView, TextView textView1) {
mTextView = textView;
this.textView = textView1;
}
@Override
public void onCreate(String s) {
}
@Override
public void onReady(String s) {
}
@Override
public void onLoading(String s, final String s1, final long l, final long l1) {
mHandler.post(new Runnable() {
@Override
public void run() {
mTextView.setVisibility(View.VISIBLE);
mTextView.setProgress((int) (((double) l1 / (double) l) * 100));
textView.setText((String.format("正在下载,已完成%d%% ,下载速度: %s", (int) (((double) l1 / (double) l) * 100), s1)));
}
});
}
@Override
public void onPause(String s, final long l, final long l1) {
mHandler.post(new Runnable() {
@Override
public void run() {
mTextView.setProgress((int) (((double) l1 / (double) l) * 100));
textView.setText("继续");
}
});
}
@Override
public void onFinish(String s) {
DownloadManager.removeTaskObserver(s, this);
// 最好不要在这里做这一步操作,因为你可能绑定了其他监听者,有一处移除,其他的均无法监听甚至出现异常
// DownloadManager.remove(taskId);
mHandler.post(new Runnable() {
@Override
public void run() {
mTextView.setProgress(100);
mTextView.setVisibility(View.GONE);
textView.setText("安装");
File file= new File(Environment.getExternalStorageDirectory().toString()
+ "/downFile/android" + idtask + ".apk");
installAPK(getApplicationContext(), file); //下载完成打开安装包
}
});
}
@Override
public void onError(String s, String s1, long l, long l1) {
mHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "下载异常", Toast.LENGTH_SHORT).show();
textView.setText("下载");
}
});
}
}
//打开安装包
public static void installAPK(Context context, File savedFile) {
Intent intent= new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= 24) { //判读版本是否在7.0以上
//参数1 上下文, 参数2 Provider地址 和配置文件中保持一致 参数3 共享的文件
Uri apkUri= FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", savedFile);
//添加这一句表示对目标应用临时授权该Uri所代表的文件
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.fromFile(savedFile), "application/vnd.android.package-archive");
}
context.startActivity(intent);
}
好了,大功告成。