DownloadManager下载超过2.1 GB的文件

时间:2014-02-12 10:07:30

标签: android android-download-manager

我正在开发一个应用程序,我正在处理的一个功能是下载一些二进制文件。其中一些非常大(超过几兆字节)。只要文件大小小于2 GB,下载就可以正常完成。

我卡在一个3.2GB的文件上,因为我获得了进度更新(我正在汇集DownloadManager以获取进度更新),但是当下载完成时,该文件不存在于目标文件路径上。在查询该下载ID的DownloadManager时,我会获得STATUS_FAILED并说明ERROR_UNKNOWN - 您希望获得的最喜欢的错误详情!

奇怪的是,这出现在大多数设备上,但对于某些设备(如Samsung SG 4 Active OS 4.2.2和LG Nexus 5 OS 4.4.2),它不会出现。

做一些额外的调查,我发现这似乎是bug in Android DownloadManager implementation。似乎Android实现将下载计数存储为int,但当该计数超过Integer.MAX_VALUE时,下载以失败结束。

我正在考虑用前台服务替换DownloadManager用法,但我不会放弃....

你们是否面对这个问题,如果是这样,你是如何解决这个问题的? 是否有任何解决方法在4.2.2之前使用DownloadManager所以我可以为每个文件下载超过2.1 GB的文件?

5 个答案:

答案 0 :(得分:4)

从Android源代码看,似乎这个问题已在JB-MR2中得到解决。

似乎在较旧的平台版本上解决此问题的唯一方法是修改服务器,使其对这些大型资源使用分块传输编码[1]。在这种情况下,该下载管理器将忽略而不是尝试解析Content-Length标头。

[1] http://en.wikipedia.org/wiki/Chunked_transfer_encoding

答案 1 :(得分:3)

要下载如此大的文件,您需要以块的形式下载这些文件。您可以使用任何支持HTTP范围选项的库,以允许多个部分下拉单个文件,支持简历等。

或者你可以在你的服务器上拆分你的大文件然后有一个文件文件,其中包含每个文件的MD5哈希值,当你第一次开始下载然后获得MD5文件一旦完成然后检查哈希匹配下载的文件。如果他们没有,那么删除该部分并将其添加到要下载的项目队列。

一旦下载了所有部分并且MD5正常工作,您可以将这些部分重新组合在一起作为单个文件。

如果您打算在SD卡中下载文件,则FAT32是默认文件系统。此文件系统的每个文件限制为4 GB。

答案 2 :(得分:2)

有一个明确的结果:

您无法修复DownloadManager 。如果它是一个错误,它将是如此。 因此,简而言之,否,您无法使用DownloadManager解决此问题。但是,您可以使用服务器端方法解决此问题,该方法已在其他答案中添加到单词中。

所以,我认为你最简单的解决方案是强制将最低sdk级别强制为JB-MR2,因为@ksasq提到此问题已经解决。

如果这种情况不合理,或者在您的情况下,您可以找到最好的文件下载库,并为此库创建类似于DownloadManager的界面。当然,应该实现此接口,以便对没有此错误的版本使用默认的DownloadManager,并对那些有此错误的人使用自定义库(如果可能的话,对于导致问题的文件)。

不幸的是,谷歌上的搜索显示{2012年上次更新了yingyixu's android-download-manager

另一个unfortunate note about this topic by CommonsWare只是验证Google支持库中没有DownloadManager。更糟糕的是,这家伙放弃了实施自己的端口的想法,因为它太复杂了。你只能希望yingyixu的图书馆或你希望找到的其他图书馆足够好。

答案 3 :(得分:0)

您可以通过将文件拆分为较小的zip文件来传递此问题。下一步是将他们加入目标,我发现->this<-可能对您有帮助。如果您不压缩文件(仅拆分选项),您应该有良好的性能。其他问题是您需要两倍的存储空间。您可以下载较小的文件,大约100MB,将其写入连接缓冲区并删除表单文件系统,这将节省空间浪费。

答案 4 :(得分:0)

您也可以使用DownloadManager的固定版本,将软件包更改为您的软件包结构并使用此版本而不是系统版本。最终,您需要从原始包android.app导入一些类。然后将您的实现注册为服务。