Android Download File With DownloadManager and Check Status (Java)

Request a download

  • Specify a url
  • Optional: Specify a name (the name is shown in Android Notification, if you enable it)
  • You can specifiy to perform download on Wifi or Mobile or both
  • Specify the download location and file name
  • Save the Download ID to check on status later
String url = ...String name = ...String downloadFileName = ...DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);Uri downloadUri = Uri.parse(item.downloadUrl);DownloadManager.Request request = new DownloadManager.Request(downloadUri);request.setTitle(name);request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);request.setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS, downloadFileName);long downloadId = downloadManager.enqueue(request);

Check download status by Download ID

long downloadId = ...Cursor cursor = downloadManager.query(new DownloadManager.Query().setFilterById(downloadId));if (cursor != null && cursor.moveToNext()) {    int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));    cursor.close();    if (status == DownloadManager.STATUS_FAILED) {        // do something when failed    }    else if (status == DownloadManager.STATUS_PENDING || status == DownloadManager.STATUS_PAUSED) {        // do something pending or paused    }    else if (status == DownloadManager.STATUS_SUCCESSFUL) {        // do something when successful    }    else if (status == DownloadManager.STATUS_RUNNING) {        // do something when running    }}

Download might not start immediately (pending), so you can run a timer to check for status to make sure it is running.

final Timer timer = new Timer();timer.schedule(new TimerTask() {    @Override    public void run() {        int status = ... // check status        if (status == DownloadManager.STATUS_RUNNING || status == DownloadManager.STATUS_SUCCESSFUL) {            runOnUiThread(new Runnable() {                @Override                public void run() {                    // update UI                }            });            timer.cancel();        }    }}, 1000);

Get a callback/notification when download is successful or cancelled.

IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);DownloadReceiver downloadReceiver = new BroadcastReceiver() {    @Override    public void onReceive(Context context, Intent intent) {        long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);        if (downloadId == -1)            return;        // query download status        Cursor cursor = downloadManager.query(new DownloadManager.Query().setFilterById(downloadId));        if (cursor.moveToFirst()) {            int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));            if(status == DownloadManager.STATUS_SUCCESSFUL){                // download is successful                String uri = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));                File file = new File(Uri.parse(uri).getPath());            }            else {                // download is cancelled            }        }        else {            // download is cancelled        }    }};registerReceiver(downloadReceiver, filter);

NOTE: Refer Android DownloadManager Listen to Download Complete and Cancel event/actionNOTE: You might want to implement a broadcast receiver for DownloadManager.ACTION_NOTIFICATION_CLICKED to appropriately handle when the user clicks on a running download in a notification or from the downloads UI.

❤️ Is this article helpful?

Buy me a coffee ☕ or support my work via PayPal to keep this space 🖖 and ad-free.

Do send some 💖 to @d_luaz or share this article.

✨ By Desmond Lua

A dream boy who enjoys making apps, travelling and making youtube videos. Follow me on @d_luaz

👶 Apps I built

Travelopy - discover travel places in Malaysia, Singapore, Taiwan, Japan.