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

概述

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

实现步骤

1.添加权限

    <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.在页面里初始化

  DownloadManager downloadManager;
  
  // 过SystemService 以获取 DownloadManager
         downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);

3.启动下载

    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.移除(停止)下载

private int removeDownload(long downloadId) {
    return downloadManager.remove(downloadId);
}

5.监听下载的完成

@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.在下载过程中,查看状态

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";
    }
}

完整代码

    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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容