android开发(23)使用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.在页面里初始化

1 DownloadManager downloadManager;
2 
3 // 过SystemService 以获取 DownloadManager
4         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

 

posted on 2013-04-09 16:53  张云飞VIR  阅读(4817)  评论(1编辑  收藏  举报