Android开发积累

Android之Downloadmanager

2019-05-05  本文已影响57人  zheng_zq

效果图:

可以实时显示下载进度


微信图片_20190506183447.png

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


微信图片_20190506183457.png

首先在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();
    }
}
上一篇下一篇

猜你喜欢

热点阅读