天天看點

Android DownloadManager下載下傳進度查詢(系列3)



Android DownloadManager下載下傳進度查詢(系列3)

我在之前寫了寫一些關于Android DownloadManager 的文章:

(系列1)《Android大資料、斷點續傳、耗時下載下傳之DownloadManager開發簡介(1)》文章連結位址:

http://blog.csdn.net/zhangphil/article/details/48949027 (系列2)《Android DownloadManager下載下傳狀态查詢(2)》文章連結位址: http://blog.csdn.net/zhangphil/article/details/48976427

文章(1)簡單介紹了Android DownloadManager的基礎使用方法,文章(2)是Android DownloadManager得基礎下載下傳狀态查詢。本文是在前兩篇文章的基礎上寫作而成,本篇文章主要介紹如何查詢Android DownloadManager某一個下載下傳任務下載下傳進度,比如,使用Android DownloadManager下載下傳某一個大檔案,在某時某刻需要查詢該檔案已經下載下傳多少位元組。

測試的MainActivity.java:

package zhangphil.demo;

import android.app.Activity;
import android.app.DownloadManager;
import android.app.DownloadManager.Query;
import android.app.DownloadManager.Request;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

	private DownloadManager downloadManager;
	private long Id;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button button = (Button) findViewById(R.id.button);
		button.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				query();
			}
		});

		downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);

		// 假設從這一個連結下載下傳一個大檔案。
		Request request = new Request(
				Uri.parse("http://apkc.mumayi.com/2015/03/06/92/927937/xingxiangyi_V3.1.3_mumayi_00169.apk"));

		// 僅允許在WIFI連接配接情況下下載下傳
		request.setAllowedNetworkTypes(Request.NETWORK_WIFI);

		// 通知欄中将出現的内容
		request.setTitle("我的下載下傳");
		request.setDescription("下載下傳一個大檔案");
		// 下載下傳過程和下載下傳完成後通知欄有通知消息。
		request.setNotificationVisibility(Request.VISIBILITY_VISIBLE | Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

		// 此處可以由開發者自己指定一個檔案存放下載下傳檔案。
		// 如果不指定則Android将使用系統預設的
		// request.setDestinationUri(Uri.fromFile(new File("")));

		// 預設的Android系統下載下傳存儲目錄
		request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "my.apk");

		// enqueue 開始啟動下載下傳...
		Id = downloadManager.enqueue(request);
	}

	// 查詢下載下傳進度,檔案總大小多少,已經下載下傳多少?
	private void query() {
		Query downloadQuery = new Query();
		downloadQuery.setFilterById(Id);
		Cursor cursor = downloadManager.query(downloadQuery);
		if (cursor != null && cursor.moveToFirst()) {
			int fileName = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME);
			int fileUri = cursor.getColumnIndex(DownloadManager.COLUMN_URI);
			String fn = cursor.getString(fileName);
			String fu = cursor.getString(fileUri);

			int totalSizeBytesIndex = cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES);
			int bytesDownloadSoFarIndex = cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR);

			// 下載下傳的檔案總大小
			int totalSizeBytes = cursor.getInt(totalSizeBytesIndex);

			// 截止目前已經下載下傳的檔案總大小
			int bytesDownloadSoFar = cursor.getInt(bytesDownloadSoFarIndex);

			Log.d(this.getClass().getName(),
					"from " + fu + " 下載下傳到本地 " + fn + " 檔案總大小:" + totalSizeBytes + " 已經下載下傳:" + bytesDownloadSoFar);

			cursor.close();
		}
	}
}
           

MainActivity.java依賴的activity_main.xml檔案代碼裡面僅僅含有一個button下載下傳查詢狀态的按鈕,以觸發查詢事件,在此不再展開贅述。

繼續閱讀