我正在开发一款Android应用程序,使用DownloadManager下载文件。它能够成功地下载某些文件(例如JPEG、MP3),但对于其他文件(例如PDF)则不成功。我不确定这是否与文件类型有关。我注册了一个BroadcastReceiver来帮助调试问题。在onReceive()回调中,我查询DownloadManager以查找失败的原因,但它只给出了一个“400”,这不是一个记录的原因。
以下是我如何使用DownloadManager:
在DownloadManager.STATUS_FAILED状态下,这是我的调试代码:
理应的情况下,原因的值应该是DownloadManager.ERROR_*中的一个常量,但400不是。在Galaxy Nexus (v4.3)和Nexus 9 (v5.1)这两个设备上发生了同样的事情。我在手机浏览器上测试了URL并确认它在应用程序之外可以工作。有人知道发生了什么吗?任何帮助都将不胜感激。
谢谢
编辑: 我试图下载的文件名中有一个空格。我进行了一些快速实验:从未起作用的文件中删除空格,向以前起作用的文件中添加空格。看起来可能与文件名包含空格有关。
编辑: 这是我解决问题的方法。我必须在服务器上对URL进行编码(URL是json响应的一部分,因此我更改了响应) url = URLEncoder.encode(url, "utf-8")
以下是我如何使用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_*
}
理应的情况下,原因的值应该是DownloadManager.ERROR_*中的一个常量,但400不是。在Galaxy Nexus (v4.3)和Nexus 9 (v5.1)这两个设备上发生了同样的事情。我在手机浏览器上测试了URL并确认它在应用程序之外可以工作。有人知道发生了什么吗?任何帮助都将不胜感激。
谢谢
编辑: 我试图下载的文件名中有一个空格。我进行了一些快速实验:从未起作用的文件中删除空格,向以前起作用的文件中添加空格。看起来可能与文件名包含空格有关。
编辑: 这是我解决问题的方法。我必须在服务器上对URL进行编码(URL是json响应的一部分,因此我更改了响应) url = URLEncoder.encode(url, "utf-8")