如何使用DownloadManager

如何使用DownloadManager

如果要下載一個圖片, 在如何從網路下載圖片以及如何使用ImageDownloader都有提供不錯的方式,
但是方法永遠不嫌多, Android又提供更簡便的方式,
使用DownloadManager就可以快速的處理下載圖片。

這個範例會用到如何使用Notification來顯示Notification以及如何使用BroadcastReceiver的綜合體,
但是更方便的是它的Notification不用自己寫。

範例是從Android DownloadManager Example去改寫的。

要下載的是這張圖

使用兩個Button來處理顯是跟下載後Intent呈現。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="personal.givemepass.downloadmanagerdemo.MainActivity">

    <Button
        android:text="start download"
        android:id="@+id/start_download"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:text="show image"
        android:id="@+id/show_image"
        android:layout_toRightOf="@id/start_download"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <ImageView
        android:id="@+id/image"
        android:layout_below="@id/start_download"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</RelativeLayout>

這邊有兩個部份, 一個是按下start download 開始下載,
一個是按下show image Intent過去打開圖片,
而下面有一個imageview是收到廣播以後,
就會把圖片顯示出來。

public class MainActivity extends AppCompatActivity {
    private Button startDownload;
    private Button showImage;
    private ImageView imageView;
    private DownloadManager manager;
    private BroadcastReceiver receiver;
    private static final String url = "https://dl.dropboxusercontent.com/u/24682760/Android_AS/DownloadManagerDemo/butterfly.png";
    private DownloadManager.Request request;
    private long downloadId;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        initView();
    }
    private void initData(){
        manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if(DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)){
                    DownloadManager.Query query = new DownloadManager.Query();
                    query.setFilterById(downloadId);
                    Cursor c = manager.query(query);
                    if (c.moveToFirst()) {
                        int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
                        if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
                            String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                            imageView.setImageURI(Uri.parse(uriString));
                            Toast.makeText(MainActivity.this, "download success", Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            }
        };
        registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
        request = new DownloadManager.Request(Uri.parse(url));
    }

    private void initView(){
        startDownload = (Button) findViewById(R.id.start_download);
        showImage = (Button) findViewById(R.id.show_image);
        imageView = (ImageView) findViewById(R.id.image);
        startDownload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                downloadId = manager.enqueue(request);
            }
        });
        showImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.setAction(DownloadManager.ACTION_VIEW_DOWNLOADS);
                startActivity(i);
            }
        });
    }
}

如果要使用DownloadManager很簡單,
其實只要網址丟入Request內就可以,
然後執行enqueue就會馬上下載。

request = new DownloadManager.Request(Uri.parse(url));
//...
downloadId = manager.enqueue(request);

那當下載完畢以後, 就會拿到一組id,
再透過這組id去跟系統查詢。

String action = intent.getAction();
                if(DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)){
    DownloadManager.Query query = new DownloadManager.Query();
    query.setFilterById(downloadId);
    Cursor c = manager.query(query);
    if (c.moveToFirst()) {
        int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
        if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
            String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
            imageView.setImageURI(Uri.parse(uriString));
            Toast.makeText(MainActivity.this, "download success", Toast.LENGTH_SHORT).show();
        }
    }
}

那你也可以直接Intent過去查看

Intent i = new Intent();            i.setAction(DownloadManager.ACTION_VIEW_DOWNLOADS);
startActivity(i);

記得打開權限

 <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

看結果

程式碼