Android DownloadManager Example

The Android DownloadManager introduced in Android 2.3. (API 9) is a system service which allows to handle long-running HTTP downloads in the background and notify the triggering application via a broadcast receiver once the download is finished.

Here is a little example for using the DownloadManager. The project will be called “de.vogella.android.downloadmanager” with the activity “DownloadManagerActivity” based on Android API9 or higher.

Change “main.xml” to the following.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<Button android:text="Start Download" android:id="@+id/button1"
		android:layout_width="wrap_content" android:layout_height="wrap_content"
		android:onClick="onClick"></Button>
	<Button android:text="View Downloads" android:id="@+id/button2"
		android:layout_width="wrap_content" android:layout_height="wrap_content"
		android:onClick="showDownload"></Button>
	<ImageView android:layout_height="wrap_content" android:id="@+id/imageView1"
		android:src="@drawable/icon" android:layout_width="wrap_content"></ImageView>
</LinearLayout>

Change the code of your activity to the following.

package de.vogella.android.downloadmanager;

import android.app.Activity;
import android.app.DownloadManager;
import android.app.DownloadManager.Query;
import android.app.DownloadManager.Request;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

public class DownloadManagerActivity extends Activity {
	private long enqueue;
	private DownloadManager dm;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		BroadcastReceiver receiver = new BroadcastReceiver() {
			@Override
			public void onReceive(Context context, Intent intent) {
				String action = intent.getAction();
				if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
					long downloadId = intent.getLongExtra(
							DownloadManager.EXTRA_DOWNLOAD_ID, 0);
					Query query = new Query();
					query.setFilterById(enqueue);
					Cursor c = dm.query(query);
					if (c.moveToFirst()) {
						int columnIndex = c
								.getColumnIndex(DownloadManager.COLUMN_STATUS);
						if (DownloadManager.STATUS_SUCCESSFUL == c
								.getInt(columnIndex)) {

							ImageView view = (ImageView) findViewById(R.id.imageView1);
							String uriString = c
									.getString(c
											.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
							view.setImageURI(Uri.parse(uriString));
						}
					}
				}
			}
		};

		registerReceiver(receiver, new IntentFilter(
				DownloadManager.ACTION_DOWNLOAD_COMPLETE));
	}

	public void onClick(View view) {
		dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
		Request request = new Request(
				Uri.parse("http://www.vogella.de/img/lars/LarsVogelArticle7.png"));
		enqueue = dm.enqueue(request);

	}

	public void showDownload(View view) {
		Intent i = new Intent();
		i.setAction(DownloadManager.ACTION_VIEW_DOWNLOADS);
		startActivity(i);
	}
}

Also add the permission to go to the internet to your app.

If you implemented this example you have an Android application which can download my picture (sorry for this ;-)) and allow you to switch to the download manager to see the finished downloads.

Hope this helps.

You find me also on Twitter.

About Lars Vogel

Lars Vogel is the founder and CEO of the vogella GmbH and works as Eclipse and Android consultant, trainer and book author. He is a regular speaker at international conferences, He is the primary author of vogella.com. With more than one million visitors per month this website is one of the central sources for Java, Eclipse and Android programming information.
This entry was posted in Android. Bookmark the permalink.

6 Responses to Android DownloadManager Example

  1. Casper Bang says:

    Interesting. I do wonder why it looks like there’s no UploadManager, feels like missing the “Yang” in “Yin and Yang”.

  2. Lars Vogel says:

    @Casper: Upload depends highly on the receiving side.

  3. Casper Bang says:

    @Lars: POST payload vs. GET body and just some slightly different HTTP codes. I’d like if I could just invoke an upload service (picture upload to Flickr, Dropbox sync etc.) without having to handle this is my own heavyweight custom background service.

  4. aiken says:

    This code help me solve my download problem. Thank a lot!

  5. Muneeb says:

    Is there any class that i can use for earlier versions of android?

  6. Lars Vogel says:

    @Muneeb AFAIK you have to use HttpClient directly. For example in a Thread..

Comments are closed.