运行效果图如下
可实现暂停,继续,断点续传,侧滑删除,点击弹出可打开的应用提示框。
1.主要运用okgo 2.0框架,根据下载的tag 拼接上用户id,根据用户id筛选下载集合数据,达到展示不同用户的下载列表。
关键代码如下:
package com.example.download.utils;
import android.content.Context;
import android.os.Environment;
import com.example.download.model.CourseModel;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.request.GetRequest;
import com.lzy.okserver.download.DownloadManager;
import com.lzy.okserver.download.DownloadService;
import java.io.File;
/**
* Created by fugang on 2018/3/20.
*/
public class DownloadUtils {
public static void download(CourseModel courseModel) {
DownloadManager downloadManager = DownloadService.getDownloadManager();
GetRequest request = OkGo.get(courseModel.courseAddress)//
.headers("headerKey1", "headerValue1")//
.headers("headerKey2", "headerValue2")//
.params("paramKey1", "paramValue1")//
.params("paramKey2", "paramValue2");
String userId=courseModel.getUserId();
String tag=courseModel.courseAddress+"userId="+userId;
downloadManager.setTargetFolder(Environment.getExternalStorageDirectory().getAbsolutePath() + "/kzkt/"+userId);
downloadManager.addTask(tag, courseModel, request, null);
}
public static String getMIMEType(Context context, String filePath) {
String type="";
File file = new File(filePath);
String fileName = file.getName().trim().toLowerCase();
if(fileName.endsWith("pdf")){
type="application/pdf";
}else if (fileName.endsWith("mp4")){
type="video/*";
}else {
type="video/*";
}
return type;
}
}
下载队列downloadadapter 适配器:
package com.example.download;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.support.v4.content.FileProvider;
import android.support.v7.widget.RecyclerView;
import android.text.format.Formatter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.example.download.model.CourseModel;
import com.example.download.utils.DownloadUtils;
import com.example.download.utils.SPTool;
import com.lzy.okserver.download.DownloadInfo;
import com.lzy.okserver.download.DownloadManager;
import com.lzy.okserver.download.DownloadService;
import com.lzy.okserver.listener.DownloadListener;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
public class DownloadAdapter extends RecyclerView.Adapter<DownloadAdapter.ViewHolder> {
private List<DownloadInfo> allTask;
private NumberFormat numberFormat;
private LayoutInflater inflater;
private Context context;
private DownloadManager downloadManager;
private DownloadInfo downloadInfo;
private String userId;
public DownloadAdapter(Context context) {
this.context = context;
numberFormat = NumberFormat.getPercentInstance();
numberFormat.setMinimumFractionDigits(2);
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void updateData() {
downloadManager = DownloadService.getDownloadManager();
getListData();
notifyDataSetChanged();
}
//获取单个用户下载列表数据
public List<DownloadInfo> getListData() {
allTask = new ArrayList<DownloadInfo>();
// SharedPreferences preferences = context.getSharedPreferences("userInfo",
// Activity.MODE_PRIVATE);
// String userInfo = preferences.getString("userInfo", "");
// try {
// JSONObject userInfoJson = new JSONObject(userInfo);
// userId = userInfoJson.getString("empNo");
//
// } catch (JSONException e) {
// e.printStackTrace();
// }
userId= (String) SPTool.get(context,"userId","");
for (int i = 0; i < downloadManager.getAllTask().size(); i++) {
DownloadInfo downloadInfo = downloadManager.getAllTask().get(i);
Log.e("fff", "tag=" + downloadInfo.getTaskKey());
Log.e("fff", "userId=" + userId);
if (downloadInfo.getTaskKey().endsWith(userId)) {
allTask.add(downloadInfo);
}
}
return allTask;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.item_download_manager, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
downloadInfo = allTask.get(position);
holder.bind(downloadInfo);
holder.refresh(downloadInfo);
DownloadListener downloadListener = new ListDownloadListener();
downloadListener.setUserTag(holder);
downloadInfo.setListener(downloadListener);
}
@Override
public int getItemCount() {
Log.e("downloadlist", "" + allTask.size());
return allTask == null ? 0 : allTask.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public ImageView icon;
public TextView name;
public TextView downloadSize;
public TextView netSpeed;
public NumberProgressBar pbProgress;
private CheckBox checkBox;
private DownloadInfo downloadInfo;
public void refresh(DownloadInfo downloadInfo) {
this.downloadInfo = downloadInfo;
refresh();
}
public ViewHolder(View itemView) {
super(itemView);
icon = (ImageView) itemView.findViewById(R.id.icon);
name = (TextView) itemView.findViewById(R.id.name);
downloadSize = (TextView) itemView.findViewById(R.id.downloadSize);
pbProgress = (NumberProgressBar) itemView.findViewById(R.id.pbProgress);
netSpeed = (TextView) itemView.findViewById(R.id.netSpeed);
checkBox = (CheckBox) itemView.findViewById(R.id.checkbox);
//选中事件
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
String tag = downloadInfo.getUrl() + "userId=" + userId;
if (b) {
checkBox.setChecked(true);
downloadManager.addTask(tag, downloadInfo.getRequest(), downloadInfo.getListener());
Log.e("downloadlist", "开始下载:" + b);
} else {
checkBox.setChecked(false);
downloadManager.pauseTask(tag);
Log.e("downloadlist", "暂停下载:" + b);
}
refresh();
}
});
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (downloadInfo.getState() == DownloadManager.FINISH) {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_VIEW);
String type = DownloadUtils.getMIMEType(context, downloadInfo.getTargetPath());
File file = new File(downloadInfo.getTargetPath());
//设置intent的data和Type属性。
Uri url = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", file);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(url, type);
context.startActivity(intent);
}
}
});
}
public void bind(DownloadInfo downloadInfo) {
CourseModel courseModel = (CourseModel) downloadInfo.getData();
if (courseModel != null) {
Glide.with(context).load(courseModel.courseCover).error(R.mipmap.ic_launcher).into(icon);
name.setText(courseModel.courseTitle);
}
}
public void refresh() {
String downloadLength = Formatter.formatFileSize(context, downloadInfo.getDownloadLength());
String totalLength = Formatter.formatFileSize(context, downloadInfo.getTotalLength());
downloadSize.setText(downloadLength + "/" + totalLength);
if (downloadInfo.getState() == DownloadManager.NONE) {
netSpeed.setText("已暂停");
checkBox.setChecked(false);
} else if (downloadInfo.getState() == DownloadManager.PAUSE) {
netSpeed.setText("已暂停");
checkBox.setChecked(false);
} else if (downloadInfo.getState() == DownloadManager.ERROR) {
netSpeed.setText("下载失败");
checkBox.setChecked(false);
} else if (downloadInfo.getState() == DownloadManager.WAITING) {
netSpeed.setText("等待中");
checkBox.setChecked(true);
} else if (downloadInfo.getState() == DownloadManager.FINISH) {
netSpeed.setText("下载完成");
checkBox.setVisibility(View.INVISIBLE);
} else if (downloadInfo.getState() == DownloadManager.DOWNLOADING) {
netSpeed.setText("下载中");
checkBox.setChecked(true);
}
//显示下载百分比
pbProgress.setMax(10000);
pbProgress.setProgress((int) (downloadInfo.getProgress() * 10000));
}
}
//删除列表数据
public void remove(DownloadInfo downloadInfo) {
String tag = downloadInfo.getUrl() + "userId=" + userId;
downloadManager.removeTask(tag, true);
Log.e("downloadlist", "remove:" + downloadInfo.getUrl());
updateData();
}
public class ListDownloadListener extends DownloadListener {
@Override
public void onProgress(DownloadInfo downloadInfo) {
if (getUserTag() == null) return;
ViewHolder holder = (ViewHolder) getUserTag();
holder.refresh(); //这里不能使用传递进来的 DownloadInfo,否者会出现条目错乱的问题
}
@Override
public void onFinish(DownloadInfo downloadInfo) {
Toast.makeText(context, "下载完成:" + downloadInfo.getTargetPath(), Toast.LENGTH_SHORT).show();
}
@Override
public void onError(DownloadInfo downloadInfo, String errorMsg, Exception e) {
if (errorMsg != null) Toast.makeText(context, errorMsg, Toast.LENGTH_SHORT).show();
}
}
}