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.