DownloadManager

ファイルのダウンロードを実現するなら、DownloadManagerを使うという方法もある・・・。

DownloadManager | Android Developers

activity_main.xmlは、

edittext1がURL入力用・・・。
button1でダウンロードのリクエストを投げる・・・。

f:id:BG1:20161007184140p:plain

BroadcastReceiverの派生クラス、DownloadReceiverを追加・・・。

MainActivity型のmainActivityをメンバとして持ち、コンストラクタの引数からもらってる・・・。

onReceiveでは、intent.getActionで取得したactionがACTION_DOWNLOAD_COMPLETE(ダウンロード完了)だった場合のみ考える・・・。
intentからintent.getLongExtraでDownloadManager.EXTRA_DOWNLOAD_IDをキーとする値を取得・・・。
これがダウンロードID・・・。
DownloadManager.Queryオブジェクトqueryを作成したら、query.setFilterByIdにダウンロードIDを渡す・・・。
このダウンロードIDをもとにqueryメソッドでフィルタリングをかける・・・。
Cursor型cの指す位置で、さらにカラムがDownloadManager.COLUMN_STATUSの値、つまりstatusを取得・・・。
statusがSTATUS_SUCCESSFULなら、Toastを表示・・・。

MainActivityは、

メンバにDownloadManager型downloadManager・・・。
getSystemServiceでDOWNLOAD_SERVICEを指定して、downloadManagerに格納・・・。

edittext1からurlもらったら、Uri.parseでUri型のdownloadUriに・・・。
downloadUri.getLastPathSegmentで、ファイル名だけ取り出してdownloadFilename・・・。
downloadUriは、DownloadManager.Requestオブジェクト生成時のコンストラクタに渡して、インスタンスはrequestに・・・。
request.setDestinationInExternalFilesDirでダウンロード先を指定・・・。
request.setTitleでタイトル、request.setAllowedNetworkTypesでネットワーク、request.setMimeTypeでMIMEタイプを指定・・・。
DownloadReceiverのコンストラクタにはthisを渡している・・・。だからmainActivityメンバがいる・・・。
registerReceiverでdownloadReceiverとACTION_DOWNLOAD_COMPLETEを拾うIntentFilterのインスタンスを登録・・・。
これでACTION_DOWNLOAD_COMPLETEしたら、onReceiveに行く・・・。
あとは、downloadManager.enqueueでrequestを投げればダウンロードが開始される・・・。

f:id:BG1:20161007231407p:plain

で、

f:id:BG1:20161007231507p:plain

と入力したら、Button1を押す・・・。

f:id:BG1:20161007231854p:plain

通知画面を見ると、ダウンロードのプログレスバーが走っていて、

f:id:BG1:20161007232150p:plain

終わったら、トーストが出る・・・。

Sample/android/DownloadManager/DownloadManager/src/DownloadManager at master · bg1bgst333/Sample · GitHub