12

DownloadManager は、不安定なモバイル インターネット接続で多くのバックグラウンド ダウンロードを行うアプリに適しているようです。

Web にあるチュートリアル コードを使用して、アプリはシステムの DM から次のようにダウンロードを要求できます。

// in onCreate()
dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);

// in requestData()
Uri u = Uri.parse("http://server:8000/feed/data");
Request dreq = new Request(u);
dreq.setNotificationVisibility(Request.VISIBILITY_HIDDEN);
downloadID = dm.enqueue(dreq);

そのコードの URL は、ローカル コンピューター上のテスト サーバーです。URL は機能し、Android エミュレーターのブラウザーはページを取得でき、アプリが DownloadManager と上記のコードを介してそのページを要求すると、サーバーは HTTP コード 200 を返します。

これは、DM がファイルを取得したときに呼び出される ACTION_DOWNLOAD_COMPLETE BroadcastReceiver の関連コードです。

Query q = new Query();
q.setFilterById(downloadID);
Log.i("handleData()", "Handling data");
Cursor c = dm.query(q);
if (c.moveToFirst()) {
  Log.i("handleData()", "Download ID: " + downloadID + " / " + c.getInt(c.getColumnIndex(DownloadManager.COLUMN_ID)));
  Log.i("handleData()", "Download Status: " + c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)));
  if (c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) {
    String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
    Log.i("handleData()", "Download URI: " + uriString);
  } else if (c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_FAILED) {
    Log.i("handleData()", "Reason: " + c.getString(c.getColumnIndex(DownloadManager.COLUMN_REASON)));
  }
}

奇妙な結果は次のとおりです。

DOWNLOAD_STATUS は 16 (または STATUS_FAILED) ですが、理由は「プレースホルダー」です。

何故ですか?サーバーが 200 ステータス コードを返したときに失敗するのはなぜですか? そして、なぜ DownloadManager によって与えられた理由がないのですか?

4

1 に答える 1

25

ここで自分自身に答えます。

問題は次のとおりです。COLUMN_REASONは文字列ではなく、数値です。

Log.i("handleData()", "Reason: " + c.getInt(c.getColumnIndex(DownloadManager.COLUMN_REASON)));

使用できる実際のエラーコードを返します。

于 2012-09-19T13:53:55.117 に答える