Android Download Manager 사용하기
Android 의 Download Manager 를 사용해 보자.Download Manager 는 HTTP 로 download 하는 것을 가능하게 해준다. 굳이 이녀석을 쓰지 않아도 http 로 download 가 안되는 것은 아니다. 하지만 이녀석을 쓰면, 굳이 Service 를 만들지 않아도 된다.
무슨소리냐하면, 원래 Service 같이 항상 떠 있는 background process 를 이용하지 않고, app 내에서 그냥 download 를 하면, app 이 onPause 등의 상태가 될 때 download 가 멈추게 된다.
근데 이 download 하나 구현하려고 background process 를 만들기도 귀찮다. 여하튼 여러가지 이유로 이것을 Android 에서 제공해준다. push alarm 같은 것을 google play service 에서 대신 해 주는 것과 같은 맥락이라고 볼 수 있겠다.
순서
일단 구현할 순서는 아래와 같다.- 대체로 외부 storage 에 저장을 하기때문에 permission 을 추가하자.
- android.permission.WRITE_EXTERNAL_STORAGE
- BroadcastReceiver 를 만들고,
- 수신받은 download id 가 내가 수행한 download id 인지 검사하고,
- 내가 수행한 download id 라면, 이제 download 가 완료된 것일 수 도 있고, cancel 된 것일 수도 있다.
- download 가 완료된 후에는 download id 를 이용해서 원하는 정보를 DownloadManager 에서 가져올 수 있다.
- Receiver 등록 : ACTION_DOWNLOAD_COMPLETE filter 와 함께 receiver 를 register 를 하자. register 를 해야 download 가 끝나면 내가 등록한 receiver 를 호출 해 준다.
- download 부분 만들기
- Request 를 만든다.
- 이 Request 를 DownloadManager 에 enqueue 한다. 이 때 download id 가 return 된다.
- download cancel 부분 만들기
- download id 를 이용해서 DownloadManager.remove(id) 를 이용해서 download 를 cancel 할 수 있다.
permission 추가
AndroidManifest.xml 에 아래처럼 permission 을 추가하자.<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
BroadcastReceiver
private BroadcastReceiver downloadCompleteReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// check whether the download-id is mine
long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0L);
if (id != mDownloadId) {
// not our download id, ignore
return;
}
DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
// make a query
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(id);
// check the status
Cursor cursor = downloadManager.query(query);
if (cursor.moveToFirst()) {
// when download completed
int statusColumn = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
if (DownloadManager.STATUS_SUCCESSFUL != cursor.getInt(statusColumn)) {
Log.w("FourthFragment", "Download Failed");
return;
}
int uriIndex = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI);
String downloadedPackageUriString = cursor.getString(uriIndex);
}else{
// when canceled
return;
}
}
};
Receiver 등록
this.getContext().registerReceiver(downloadCompleteReceiver,
new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
Download
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String fUrl = "http://upload.wikimedia.org/wikipedia/commons/c/cf/Frog_on_river_4000x3000_26-09-2010_11-01am_2mb.jpg";
String dlpath = "myfiles";
String newFilename = dlpath + "/TestImage.jpg";
// Make a request
DownloadManager.Request request
= new DownloadManager.Request(Uri.parse(fUrl))
.setAllowedOverRoaming(false)
.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI)
.setTitle(newFilename)
.setDescription("ProcessUpdaterExmpale");
if (android.os.Environment.getExternalStorageState()
.equals(android.os.Environment.MEDIA_MOUNTED)) {
request.setDestinationInExternalPublicDir(
android.os.Environment.DIRECTORY_DOWNLOADS, newFilename);
}
// you can hide download status
// request.setVisibleInDownloadsUi(false);
// request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);
// enqueue
DownloadManager dm = (DownloadManager) ctx.getSystemService(Context.DOWNLOAD_SERVICE);
mDownloadId = dm.enqueue(request);
}
});
Cancel Download
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// cancel
if(mDownloadId != null) {
((DownloadManager) ctx.getSystemService(Context.DOWNLOAD_SERVICE)).remove(mDownloadId);
}
}
});
댓글 없음:
댓글 쓰기