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); } } });
댓글 없음:
댓글 쓰기