效果图:
可以实时显示下载进度

下载完成后可以Toast出下载文件的保存路径

首先在AndroidManifest.xml配置权限:
<!--在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 从SDCard读取数据权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!-- 访问网络权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
MainActivity.java:
package com.example.mrzheng.downloadmanagertest01;
import android.app.DownloadManager;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button button_download; //点击下载按钮
private TextView text_progress; //进度显示文本
private DownloadManager mDownloadManager; //声明一个下载管理器
private long mDownloadId = 0;// 当前任务的下载编号
private Handler mHandler = new Handler(); // 声明一个处理器对象
public String vidioUrlArray; //下载的视频链接
public String mvidiopath; //下载的视频保存路径
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button_download=findViewById(R.id.button_download);
button_download.setOnClickListener(this);
text_progress=findViewById(R.id.text_progress);
mDownloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
vidioUrlArray="http://150.138.233.185/om.tc.qq.com/AHMHTPL3mWi5CWqLon8cvk8sGOW-MEdKGIWtYTBf0U-g/uwMROfz0r5zIIaQXGdGnC2dfDmaaPLcWyvonPVSZ3cyHcMuS/k0769pozuio.mp4?vkey=9A24548B5C696963E8D1D8C1FA04E1F6EE796AEF80105930C2097168F8B1EA8A2FAF4183171E59B70CCA6B671CC8BC75CBE74B368C87F34DAE1D035FFBBFA1A0A805339FD5C772A9EDAA099762C86838E0742C9530122D0E302FA6A93DB13F54A103E2206708A491";
}
@Override
public void onClick(View v) {
if(v.getId()==R.id.button_download){
download();
}
}
private void download() {
Toast.makeText(MainActivity.this,"开始下载",Toast.LENGTH_LONG).show();
// 根据视频的下载地址构建一个Uri对象
Uri uri = Uri.parse(vidioUrlArray);
// 创建一个下载请求对象,指定从哪个网络地址下载文件
DownloadManager.Request down = new DownloadManager.Request(uri);
// 设置允许下载的网络类型
down.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
// 设置下载文件在本地的保存路径
down.setDestinationInExternalFilesDir(MainActivity.this, Environment.DIRECTORY_DCIM, 6 + ".mp4");
// 把下载请求对象加入到下载管理器的下载队列中
mDownloadId = mDownloadManager.enqueue(down);
// 延迟100毫秒后启动下载进度的刷新任务
//mHandler.postDelayed(mRefresh, 100);
starts();
}
private void starts() {
new Thread() {
@Override
public void run() {
super.run();
boolean isFinished = false;
// 创建一个下载查询对象,按照下载编号进行过滤
DownloadManager.Query down_query = new DownloadManager.Query();
// 设置下载查询对象的编号过滤器
down_query.setFilterById(mDownloadId);
// 向下载管理器发起查询操作,并返回查询结果集的游标
Cursor cursor = mDownloadManager.query(down_query);
while (cursor.moveToNext()) {
//Toast.makeText(MainActivity.this,"进入了while循环",Toast.LENGTH_LONG).show();
int nameIdx = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME);
int uriIdx = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI);
int totalSizeIdx = cursor.getColumnIndex(
DownloadManager.COLUMN_TOTAL_SIZE_BYTES);
int nowSizeIdx = cursor.getColumnIndex(
DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR);
// 根据总大小和已下载大小,计算当前的下载进度
final int progress = (int) (100 * cursor.getLong(nowSizeIdx) / cursor.getLong(totalSizeIdx));
// Toast.makeText(MainActivity.this,progress,Toast.LENGTH_LONG).show();
if (cursor.getString(uriIdx) == null) {
break;
}
runOnUiThread(new Runnable() {
@Override
public void run() {
text_progress.setText("进度:"+progress+"%");
}
});
// Android7.0之后提示COLUMN_LOCAL_FILENAME已废弃
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
mvidiopath = cursor.getString(nameIdx);
} else {
// 所以7.0之后要先获取文件的Uri,再根据Uri获取文件路径
String fileUri = cursor.getString(uriIdx);
mvidiopath = Uri.parse(fileUri).getPath();
}
if (progress == 100) { // 下载完毕
isFinished = true;
}
}
cursor.close(); // 关闭数据库游标
if (!isFinished) { // 未完成,则继续刷新
// 延迟100毫秒后再次启动下载进度的刷新任务
mHandler.postDelayed(this, 100);
} else { // 已完成
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,mvidiopath,Toast.LENGTH_LONG).show();
}
});
}
}
}.start();
}
}
网友评论