Android DownloadManager:下载失败,但COLUMN_REASON只返回"占位符"

时间:2012-09-19 10:54:46

标签: android download-manager

对于在移动互联网连接上有大量后台下载的应用程序,

DownloadManager似乎是正确的选择。

使用网络上的教程代码,该应用程序可以从系统的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.

这是ACTION_DOWNLOAD_COMPLETE BroadcastReceiver中的相关代码,当DM检索到文件时会调用它。

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没有给出理由?

1 个答案:

答案 0 :(得分:20)

在这里回答自己。

问题在于:COLUMN_REASON不是字符串,而是数字值。

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

将返回可以使用的实际错误代码。