我正在开发一款Android应用,我使用DownloadManager下载文件。它能够成功下载某些文件(例如JPEG,MP3),但对其他文件不成功(例如PDF)。我不确定它与文件类型有关。我注册了BroadcastReceiver来帮助调试问题。在onReceive()回调中,我查询DownloadManager以找出失败的原因,但它只是给出了" 400",这不是记录的原因。
以下是我使用DownloadManager的方法:
DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(url);
request.setTitle(filename);
request.setDestinationInExternalPublicDir(folder, filename);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
manager.enqueue(request);
在DownloadManager.STATUS_FAILED上,这是我的调试代码:
DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
Cursor cursor = manager.query(query);
if(cursor.moveToFirst()){
int columnReason = cursor.getColumnIndex(DownloadManager.COLUMN_REASON);
int reason = cursor.getInt(columnReason);
Log.e("App", reason);
// the value of reason is 400 which is not a valid DownloadManager.ERROR_*
}
reason的值应该是常量DownloadManager.ERROR_ *之一,但400不是。同样的事情发生在两个设备上:Galaxy Nexus(v4.3)& Nexus 9(v5.1)。我在手机浏览器上测试了该网址,并确认该功能在应用外部有效。有谁知道发生了什么?任何帮助将不胜感激。
由于
编辑: 我尝试下载的文件在文件名中有一个空格。我做了一些快速实验:从不起作用的文件中删除空格,为之前工作的文件添加空间。它似乎可能与包含空格的文件名有关。
编辑: 这就是我为解决问题所做的工作。我必须在服务器上对URL进行编码(URL是json响应的一部分,所以我更改了响应)
url = URLEncoder.encode(网址," utf-8")
答案 0 :(得分:4)
这400原因是HTTP错误。引用文档:
提供有关下载状态的更多详细信息。其含义取决于COLUMN_STATUS的值。当COLUMN_STATUS为STATUS_FAILED时,这表示发生的错误类型。如果发生HTTP错误,这将保留RFC 2616中定义的HTTP状态代码。否则,它将保留ERROR_ *常量之一。 [...]
https://developer.android.com/reference/android/app/DownloadManager.html#COLUMN_REASON
此HTTP错误意味着
400 Bad Request 由于被认为是客户端错误(例如,格式错误的请求语法,无效的请求消息框架或欺骗性请求路由),服务器无法或不会处理请求。
如果您收到其他HTTP错误,请参阅此页面了解其含义:https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error
答案 1 :(得分:0)
这行代码可以简单地删除URL中的空格:
url = url.replaceAll(" ", "%20");
当这个已清理的URL重定向到另一个带空格的URL时,可能会发生奇怪的想法。例如要求:
GET http://example.com/file%20with%20spaces.pdf HTTP/1.1
Host: example.com
导致重定向:
HTTP/1.1 301 Moved Permanently
Location: http://example.com/new file with spaces.pdf
DownloadManager将遵循此重定向并执行此未清理网址的请求:
GET http://example.com/new file with spaces.pdf HTTP/1.1
Host: example.com
导致错误400:
HTTP/1.0 400 Bad request: request protocol version denied
遗憾的是,我发现的唯一解决方法是在代码中预先解析此重定向并清理第二个URL。