DownloadManager在下载失败时发送“STATUS_SUCCESSFUL”。

8

好的,我正在下载文件(图片)。当下载完成后,我想发送一个带有本地URI的消息来表示该图像已下载。但是有20%的时间我会遇到以下问题:

6-01 18:46:39.900: INFO/DownloadManager(412): Initiating request for download 605
06-01 18:46:39.910: WARN/DownloadManager(412): Aborting request for download 605: Trying to resume a download that can't be resumed
06-01 18:46:39.910: INFO/ololo(2826): Okay, I'll broadcast.
06-01 18:46:39.990: WARN/ImageView(2826): Unable to open content: content://downloads/my_downloads/605
    java.io.FileNotFoundException: No filename found.
    at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:145)...
06-01 18:46:39.990: INFO/System.out(2826): resolveUri failed on bad bitmap uri: content://downloads/my_downloads/605
06-01 18:46:39.990: INFO/ololo(2826): content://downloads/my_downloads/605 was set for android.widget.ImageView@408a2cf0

这里是代码

Long downloadId = downloadIds.get(this);

if(downloadId == intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)) {
    DownloadManager.Query query = new DownloadManager.Query();
    query.setFilterById(downloadId);
    Cursor cursor = downloadManager.query(query);

    if(cursor.moveToFirst()) {

        switch (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS))) {
            case DownloadManager.STATUS_SUCCESSFUL : {
                Log.i("ololo", "Okay, I'll broadcast.");
                // Broadcasting
                break;
            }
            case DownloadManager.STATUS_FAILED : {
                Log.i("ololo", "Bad, I won't broadcast.");
                int reason = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_REASON));
                if(reason == DownloadManager.ERROR_CANNOT_RESUME || reason == DownloadManager.ERROR_UNKNOWN) {
                    // Rerun download
                }
                break;
            }
            default:
                break;
        }
    }
}

嗨,我遇到了同样的问题。你解决了它或者理解了出错的原因吗? - Tal Kanel
@TalKanel 这个问题只出现在三星设备上(Galaxy Tab 10.1或其他型号,无论是3.2、2.3.3还是4.0都有可能,但从未在任何HTC设备上出现)。我认为这是由于他们自己的DownloadManager实现存在缺陷。因此,我的团队领导编写了自己的实现,并且它运行良好。 - efpies
太糟糕了,我需要在三星平板P7510和P5110(GALAXY TAB 10.1 ONE和TWO)上使用它,并且我需要它能够在你提到的特定操作系统版本上运行。所以我想我必须实现自己的解决方法。 - Tal Kanel
1
下载管理器在至少LG Nexus 4.4.2上仍会触发两次成功状态(请参见下面答案中的错误报告链接)。我花了半天时间才放弃。使用http://loopj.com/android-async-http/、https://code.google.com/p/google-http-java-client/或https://code.google.com/p/basic-http-client/中的任何一个都可以提供一个抽象的AsyncTask,它们看起来都很有前途。 - Petrus Repo
1个回答

8
DownloadManager存在缺陷,无法正常工作。此问题曾向Google报告:https://code.google.com/p/android/issues/detail?id=18462
对于单个文件下载,您可以通过指定一个唯一的目录来解决此问题,该目录专门用于此目的,并在DownloadManager.STATUS_SUCCESSFUL后从该目录中获取任何内容。
对于多文件下载,我暂时想不到解决方法,除非您能够在源处重命名文件。

是的,使用HTTP ETags可能会解决这个问题。然而,在HTTP规范中,使用HTTP ETags是可选的,因此,使用ETags来解决这个问题取决于是否直接管理访问Web服务器以添加ETags支持。我仍然认为DownloadManager存在缺陷,因为它在没有ETags支持的情况下无法正常工作。 - Phileo99
我遇到了一个类似的问题...在运行下载时出现了STATUS_FAILED...你有什么想法吗? - CoDe
DownloadManager在操作系统低于4.2.2的情况下无法完成文件大小超过Integer.MAX_VALUE(~2.1 GB)的下载。问题已在此处报告:https://dev59.com/rGEi5IYBdhLWcg3wCoQp。 - gunar
这个 bug 还没有修复。你能否建议一种替代方法,在使用 DownloadManager 类时检查下载是否成功或失败? - suv

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