[컴][안드로이드] Download Manager



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 에서 대신 해 주는 것과 같은 맥락이라고 볼 수 있겠다.

순서

일단 구현할 순서는 아래와 같다.

  1. 대체로 외부 storage 에 저장을 하기때문에 permission 을 추가하자.
    1. android.permission.WRITE_EXTERNAL_STORAGE
  2. BroadcastReceiver 를 만들고,
    1. 수신받은 download id 가 내가 수행한 download id 인지 검사하고,
    2. 내가 수행한 download id 라면, 이제 download 가 완료된 것일 수 도 있고, cancel 된 것일 수도 있다.
    3. download 가 완료된 후에는 download id 를 이용해서 원하는 정보를 DownloadManager 에서 가져올 수 있다.
  3. Receiver 등록 : ACTION_DOWNLOAD_COMPLETE filter 와 함께 receiver 를 register 를 하자. register 를 해야 download 가 끝나면 내가 등록한 receiver 를 호출 해 준다.
  4. download 부분 만들기
    1. Request 를 만든다.
    2. 이 Request 를 DownloadManager 에 enqueue 한다. 이 때 download id 가 return 된다.
  5. download cancel 부분 만들기
    1. 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);
        }
    }
});



See Also

  1. 쿠...sal: [컴][안드로이드] Broadcast Receiver에 대해서
  2. 쿠...sal: [컴][안드로이드] registerReceiver 관련 참고사항, 소스 코드
  3. NamhSamples/ProgressUpdaterActivity.java at master · i5on9i/NamhSamples

댓글 없음:

댓글 쓰기