Android DownloadManager:下载失败,但COLUMN_REASON仅返回“占位符”

12

在移动互联网连接不稳定的应用程序中,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个回答

26
回答自己。
问题在于:COLUMN_REASON不是字符串,而是一个数字值。
Log.i("handleData()", "Reason: " + c.getInt(c.getColumnIndex(DownloadManager.COLUMN_REASON)));

将返回一个实际的错误代码,可以用来处理。


我在哪里可以看到每个原因的含义? - Nick
2
DownloadManager API文档中列出了几个可能的值-请查找该页面上的“COLUMN_REASON的值”。 - hez
1
为了那些通过谷歌搜索的人,结果表明,由 DownloadManager 提供的 Cursor 在查询 COLUMN_REASON 类型(通过 getType())时仍然报告其类型为 String(并将其值转换为 placeholder)。改为查询数值,正确的原因将被提供。 - technicalflaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接