前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android开发(22)使用DownloadManager下载文件

Android开发(22)使用DownloadManager下载文件

作者头像
张云飞Vir
发布2020-03-16 15:14:34
2.5K0
发布2020-03-16 15:14:34
举报
文章被收录于专栏:写代码和思考

概述

使用DownloadManager 是个很好用的下载方式。它会出现在任务栏,指示当前的下载位置。它使用广播来接收完成消息,点击任务事件的交互。

实现步骤

1.添加权限

代码语言:javascript
复制
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
    <permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />

2.在页面里初始化

代码语言:javascript
复制
  DownloadManager downloadManager;
  
  // 过SystemService 以获取 DownloadManager
         downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);

3.启动下载

代码语言:javascript
复制
    Request request = new Request(
    Uri.parse("http://192.168.3.123:8080/androidautoupdate/apks/2.zip"));
    
    request.setAllowedNetworkTypes(
    DownloadManager.Request.NETWORK_MOBILE
    | DownloadManager.Request.NETWORK_WIFI)
    .setAllowedOverRoaming(false) // 缺省是true
    .setTitle("更新") // 用于信息查看
    .setDescription("下载apk") // 用于信息查看
    .setDestinationInExternalPublicDir(
    Environment.DIRECTORY_DOWNLOADS, "2.zip");
    mDownloadId = downloadManager.enqueue(request); // 加入下载队列
    
    startQuery(mDownloadId);

4.移除(停止)下载

代码语言:javascript
复制
private int removeDownload(long downloadId) {
    return downloadManager.remove(downloadId);
}

5.监听下载的完成

代码语言:javascript
复制
@Override
protected void onPause() {
    stopQuery();
    this.unregisterReceiver(receiver);

    super.onPause();
}

@Override
protected void onResume() {
    IntentFilter filter = new IntentFilter(
            DownloadManager.ACTION_DOWNLOAD_COMPLETE);
    this.registerReceiver(receiver, filter);

    IntentFilter filter22 = new IntentFilter(
            DownloadManager.ACTION_NOTIFICATION_CLICKED);
    this.registerReceiver(receiver2, filter22);

    startQuery(mDownloadId);
    super.onResume();
}

// 监听下载结束,启用BroadcastReceiver
BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
        String action = intent.getAction();
        if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {

            long downloadId = intent.getLongExtra(
                    DownloadManager.EXTRA_DOWNLOAD_ID, 0);
            // 查询
            Query query = new Query();
            query.setFilterById(downloadId);
            Cursor c = dm.query(query);
            if (c.moveToFirst()) {
                int columnIndex = c
                        .getColumnIndex(DownloadManager.COLUMN_STATUS);
                if (DownloadManager.STATUS_SUCCESSFUL == c
                        .getInt(columnIndex)) {

                    String uriString = c
                            .getString(c
                                    .getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));

                    //removeDownload(downloadId);
                    Toast.makeText(MainActivity.this,
                            "get file complete: " + uriString, 0).show();
                    // Uri.parse(uriString);
                }
            }// endif

        }// endif

    }// onReceive
};// end class receiver

6.在下载过程中,查看状态

代码语言:javascript
复制
class QueryRunnable implements Runnable {
    public long DownID;

    @Override
    public void run() {
        queryState(DownID);
        handler.postDelayed(runnable, step);
    }
};

private void startQuery(long downloadId) {
    if (downloadId != 0) {
        runnable.DownID = downloadId;
        handler.postDelayed(runnable, step);
    }

};

private void stopQuery() {
    handler.removeCallbacks(runnable);
}

private void queryState(long downID) {
    // 关键:通过ID向下载管理查询下载情况,返回一个cursor
    Cursor c = downloadManager.query(new DownloadManager.Query()
            .setFilterById(downID));
    if (c == null) {
        Toast.makeText(this, "Download not found!", Toast.LENGTH_LONG)
                .show();
    } else { // 以下是从游标中进行信息提取
        if(!c.moveToFirst()){
            c.close();
            return;
        }
        Log.d(TAG,
                "Column_id : "
                        + c.getLong(c
                                .getColumnIndex(DownloadManager.COLUMN_ID)));
        Log.d(TAG,
                "Column_bytes_downloaded so far : "
                        + c.getLong(c
                                .getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)));
        Log.d(TAG,
                "Column last modified timestamp : "
                        + c.getLong(c
                                .getColumnIndex(DownloadManager.COLUMN_LAST_MODIFIED_TIMESTAMP)));
        Log.d(TAG,
                "Column local uri : "
                        + c.getString(c
                                .getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)));
        Log.d(TAG,
                "Column statue : "
                        + c.getInt(c
                                .getColumnIndex(DownloadManager.COLUMN_STATUS)));
        Log.d(TAG,
                "Column reason : "
                        + c.getInt(c
                                .getColumnIndex(DownloadManager.COLUMN_REASON)));

        int st = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
        Toast.makeText(this, statusMessage(st), Toast.LENGTH_LONG).show();
        //Log.i(TAG, statusMessage(st));
        
        c.close();
    }
}

private String statusMessage(int st) {
    switch (st) {
    case DownloadManager.STATUS_FAILED:
        return "Download failed";
    case DownloadManager.STATUS_PAUSED:
        return "Download paused";
    case DownloadManager.STATUS_PENDING:
        return "Download pending";
    case DownloadManager.STATUS_RUNNING:
        return "Download in progress!";
    case DownloadManager.STATUS_SUCCESSFUL:
        return "Download finished";
    default:
        return "Unknown Information";
    }
}

完整代码

代码语言:javascript
复制
    package example.downloaddemo;
    
    import java.io.File;
    
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.os.Handler;
    import android.os.Message;
    import android.app.Activity;
    import android.app.DownloadManager;
    import android.app.DownloadManager.Query;
    import android.app.DownloadManager.Request;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.database.Cursor;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.widget.Toast;
    
    /**
     * 参考:http://blog.csdn.net/flowingflying/article/details/6925683
     * @author yunfei
     *
     */
    public class MainActivity extends Activity {
        private static final String TAG = "PDWY";
        // an ID for the download, unique across the system. This ID is used to make
        // future calls related to this download.
        long mDownloadId;
        DownloadManager downloadManager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // 过SystemService 以获取 DownloadManager
            downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
    
        }
    
        @Override
        protected void onPause() {
            stopQuery();
            this.unregisterReceiver(receiver);
    
            super.onPause();
        }
    
        @Override
        protected void onResume() {
            IntentFilter filter = new IntentFilter(
                    DownloadManager.ACTION_DOWNLOAD_COMPLETE);
            this.registerReceiver(receiver, filter);
    
            IntentFilter filter22 = new IntentFilter(
                    DownloadManager.ACTION_NOTIFICATION_CLICKED);
            this.registerReceiver(receiver2, filter22);
    
            startQuery(mDownloadId);
            super.onResume();
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    
        public void lookDownload() {
            startActivity(new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS));
        }
    
        public void onClick(View view) {
            int id = view.getId();
            if (id == R.id.start) {
                Request request = new Request(
                        Uri.parse("http://192.168.3.123:8080/androidautoupdate/apks/2.zip"));
    
                request.setAllowedNetworkTypes(
                        DownloadManager.Request.NETWORK_MOBILE
                                | DownloadManager.Request.NETWORK_WIFI)
                        .setAllowedOverRoaming(false) // 缺省是true
                        .setTitle("更新") // 用于信息查看
                        .setDescription("下载apk") // 用于信息查看
                        .setDestinationInExternalPublicDir(
                                Environment.DIRECTORY_DOWNLOADS, "2.zip");
                mDownloadId = downloadManager.enqueue(request); // 加入下载队列
    
                startQuery(mDownloadId);
            }
            if (id == R.id.stop) {
                stopQuery();
                removeDownload(mDownloadId);
            }
            if (id == R.id.look) {
                lookDownload();
            }
        }
    
        private int removeDownload(long downloadId) {
            return downloadManager.remove(downloadId);
        }
    
        Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                super.handleMessage(msg);
            }
    
        };
    
        int step = 1000;
        QueryRunnable runnable = new QueryRunnable();
    
        class QueryRunnable implements Runnable {
            public long DownID;
    
            @Override
            public void run() {
                queryState(DownID);
                handler.postDelayed(runnable, step);
            }
        };
    
        private void startQuery(long downloadId) {
            if (downloadId != 0) {
                runnable.DownID = downloadId;
                handler.postDelayed(runnable, step);
            }
    
        };
    
        private void stopQuery() {
            handler.removeCallbacks(runnable);
        }
    
        private void queryState(long downID) {
            // 关键:通过ID向下载管理查询下载情况,返回一个cursor
            Cursor c = downloadManager.query(new DownloadManager.Query()
                    .setFilterById(downID));
            if (c == null) {
                Toast.makeText(this, "Download not found!", Toast.LENGTH_LONG)
                        .show();
            } else { // 以下是从游标中进行信息提取
                if(!c.moveToFirst()){
                    c.close();
                    return;
                }
                Log.d(TAG,
                        "Column_id : "
                                + c.getLong(c
                                        .getColumnIndex(DownloadManager.COLUMN_ID)));
                Log.d(TAG,
                        "Column_bytes_downloaded so far : "
                                + c.getLong(c
                                        .getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)));
                Log.d(TAG,
                        "Column last modified timestamp : "
                                + c.getLong(c
                                        .getColumnIndex(DownloadManager.COLUMN_LAST_MODIFIED_TIMESTAMP)));
                Log.d(TAG,
                        "Column local uri : "
                                + c.getString(c
                                        .getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)));
                Log.d(TAG,
                        "Column statue : "
                                + c.getInt(c
                                        .getColumnIndex(DownloadManager.COLUMN_STATUS)));
                Log.d(TAG,
                        "Column reason : "
                                + c.getInt(c
                                        .getColumnIndex(DownloadManager.COLUMN_REASON)));
    
                int st = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
                Toast.makeText(this, statusMessage(st), Toast.LENGTH_LONG).show();
                //Log.i(TAG, statusMessage(st));
                
                c.close();
            }
        }
    
        private String statusMessage(int st) {
            switch (st) {
            case DownloadManager.STATUS_FAILED:
                return "Download failed";
            case DownloadManager.STATUS_PAUSED:
                return "Download paused";
            case DownloadManager.STATUS_PENDING:
                return "Download pending";
            case DownloadManager.STATUS_RUNNING:
                return "Download in progress!";
            case DownloadManager.STATUS_SUCCESSFUL:
                return "Download finished";
            default:
                return "Unknown Information";
            }
        }
    
        // 监听下载结束,启用BroadcastReceiver
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
    
                DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                String action = intent.getAction();
                if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
    
                    long downloadId = intent.getLongExtra(
                            DownloadManager.EXTRA_DOWNLOAD_ID, 0);
                    // 查询
                    Query query = new Query();
                    query.setFilterById(downloadId);
                    Cursor c = dm.query(query);
                    if (c.moveToFirst()) {
                        int columnIndex = c
                                .getColumnIndex(DownloadManager.COLUMN_STATUS);
                        if (DownloadManager.STATUS_SUCCESSFUL == c
                                .getInt(columnIndex)) {
    
                            String uriString = c
                                    .getString(c
                                            .getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
    
                            //removeDownload(downloadId);
                            Toast.makeText(MainActivity.this,
                                    "get file complete: " + uriString, 0).show();
                            // Uri.parse(uriString);
                        }
                    }// endif
    
                }// endif
    
            }// onReceive
        };// end class receiver
    
        // 监听下载结束,启用BroadcastReceiver
        BroadcastReceiver receiver2 = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                long downloadId = intent.getLongExtra(
                        DownloadManager.EXTRA_DOWNLOAD_ID, 0);
    
                String action = intent.getAction();
                if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)) {
                    lookDownload();
                }
            }
        };//
    }

参考资料

http://developer.android.com/intl/zh-CN/reference/android/app/DownloadManager.html

http://blog.csdn.net/gf771115/article/details/7019033

http://stackoverflow.com/questions/3028306/download-a-file-with-android-and-showing-the-progress-in-a-progressdialog

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 实现步骤
  • 完整代码
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档