delete from hateblo.jp where 1=1;

タイトルに意味はありません。

DownloadManagerのちょっとマニアックな使い方

対象

  • Androidアプリ開発
  • ファイルをダウンロードしたい
  • ダウンロード先がちょっと特殊
    • 今回の例ではBasic Authentication

実装

Uri uri = Uri.parse("https://www.example.com/project/attachment/screenshot.png");
DownloadManager.Request r = new DownloadManager.Request(uri);
// 通知バーのところに表示される名前
r.setTitle("テスト - screenshot.jpg");
// 実際に保存されるファイル名
r.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "screenshot.jpg");
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
	//メディアスキャンを許可する(ギャラリーアプリとかで参照可能になる)
	r.allowScanningByMediaScanner();
	//ダウンロード中・ダウンロード完了時にも通知を表示する
	r.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
}
//カスタムヘッダーを定義する
//ここでCookieとかするとセッション情報を引き回せるかもしれない(未検証)
r.addRequestHeader("X-Custom-API-Key","CuSTomapiKey");
//Basic認証用のヘッダーを付与する
String auth = "BasicUserId" + ":" + "BasicUserPassword";
String base64 = Base64.encodeToString(auth.getBytes(), Base64.NO_WRAP);
r.addRequestHeader("Authorization", "Basic " + base64);

//ダウンロード開始
DownloadManager dm = (DownloadManager) getActivity().getSystemService(Context.DOWNLOAD_SERVICE);
dm.enqueue(r);
諸注意

上記コードはAPI9以降および、API11以降の機能を使用するため、対象メソッドには以下の記載が必須なので、注意が必要。

@SuppressLint("NewApi")
@TargetApi(Build.VERSION_CODES.GINGERBREAD)

また、以下の権限が必要となる。これがないと、キューに投入したときに例外が発生する。

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

実例

production code

※本線リリースは来月第一週目の週末の予定であるため現時点ではBetaのみ

スクリーンショット(ダウンロード)


ダウンロードアプリでの表示結果

参考文献