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;
/**
* @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(
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();
}
}
};
//
}
联系客服