2014-02-12 255 views
15

我正在開發一個應用程序,我正在開發的功能之一就是下載一些二進制文件。其中一些非常大(超過幾兆字節)。只要文件大小小於2 GB,下載工作就會順利完成。DownloadManager下載超過2.1 GB的文件

我被困在3.2GB的文件中,因爲我得到了進度更新(我在爲進度更新彙集DownloadManager),但是當下載完成時,文件不存在於目標文件路徑中。詢問該DownloadManager該下載ID,我得到STATUS_FAILED和原因ERROR_UNKNOWN - 人們會希望的最喜歡的錯誤細節!

奇怪的是,這出現在大多數設備上,但對於一些(如三星SG 4活動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的內容?

+0

檢查出Koush的Ion:https://github.com/koush/ion它非常好,它可能適用於大型文件 – josebama

+0

@josebama:是從UI中釋放的實際下載?我的意思是,如果用戶旋轉設備,退出應用程序,然後重新進入,下載是否繼續並與整個UI保持一致? – gunar

+0

我無法確認,但它應該是 – josebama

回答

2

要下載這麼大的文件,你需要下載那些塊。您可以使用任何支持HTTP範圍選項的庫來允許將多個文件分割爲多個文件,支持簡歷等。

或者您可以在服務器上拆分大文件,然後使用帶有MD5散列的文本文件每個文件,當你第一次開始下載時,一旦完成後獲取MD5文件,然後檢查哈希匹配下載的部分。如果他們沒有刪除那件作品並將其添加到要下載的項目隊列中。

一旦所有的作品下載和MD5的作品,你可以把作品單一文件重新組合。

如果您正在考慮將文件下載到SD卡中,那麼FAT32是默認的文件系統。此文件系統的每個文件限制爲4 GB。

+0

你總結了迄今爲止所有其他人所說的話:)但我認爲你沒有提供新的東西。 – gunar

+0

這只是你可以通過它的方式,迄今爲止我還沒有閱讀其他答案。我不認爲我複製了它們,只是簡單地寫了這些內容,我不知道爲什麼你看起來我沒有提供新的東西。 –

+0

接受這個答案,即使它沒有真正回答它,因爲沒有合理的答案。最後我寫了自己的下載管理器,但這個答案儘可能接近我們的接受。最初我想接受來自'ksasq'的答案,但是我無法驗證它,因爲我沒有一個知道處理chuncked內容的服務器。 'Range'解決方案適用於我,因爲服務器支持它。謝謝! – gunar

0

您可以通過將文件拆分爲更小的zip文件來傳遞此問題。下一步是加入他們的目標,我發現->this<-可能會幫助你。如果你不會壓縮文件(僅分割選項),你應該有很好的性能。其他問題是你需要兩倍的存儲空間。您可以下載較小的文件(大約100MB),將其寫入已加入的緩衝區並刪除表單文件系統,這將保留空間浪費。

+0

感謝您回答(+1),但這不是服務器端的選項。 – gunar

4

從查看Android源代碼看來,這個問題在JB-MR2中得到了解決。

似乎在較舊的平臺版本上解決此問題的唯一方法是修改服務器,使其對這些大型資源使用分塊傳輸編碼[1]。在這種情況下,下載管理器將忽略並且不嘗試解析Content-Length報頭。

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

+0

感謝您回答(+1),但正如所說的,不幸的是,這不是服務器端的選項。無論如何,我不知道是否有人嘗試過這種方法,並確認它是否正常工作 – gunar

+0

目前爲止,此答案有5個upvotes,並且沒有確認這實際上起作用。我無法訪問支持chuncked內容響應的服務器以檢查它。 – gunar

2

有這樣一個明確的結果:

你不能修復DownloadManager。如果它是一個錯誤,它會是如此。 因此,簡而言之,沒有,您無法使用DownloadManager解決此問題。但是,您可以使用服務器端方法解決該問題,這種方法已在其他答案中加入了文字。

所以,我認爲你最簡單的解決方案是強制JB-MR2的最低sdk級別,因爲@ksasq提到這個問題已經解決。

如果這不合情理,或者您的情況可能,您可以找到最好的文件下載庫,併爲此庫創建類似於DownloadManager的界面。當然,這個接口應該被實現爲使用默認的DownloadManager來處理沒有這個錯誤的版本,並且使用那些有這個錯誤的自定義庫(以及如果可能的話導致問題的文件)。

不幸的是,在谷歌搜索結果顯示yingyixu's android-download-manager在2012年

另一個unfortunate note about this topic by CommonsWare只是爲了驗證有谷歌的支持庫沒有下載管理器最後更新。更糟糕的是,這傢伙放棄了實施自己的港口的想法,因爲它太複雜了。你只能希望yingyixu的圖書館或你希望找到的其他圖書館足夠好。

+0

下載只是應用程序的功能之一。我無法將最低等級設置爲JB-MR2,因爲我將失去剩餘的市場份額。 – gunar

0

您也可以採用固定版本DownloadManager,將軟件包更改爲您的軟件包結構並使用此版本而不是系統版本。最終你需要從原包android.app中導入一些類。然後將您的實施註冊爲服務。

+0

實際下載不是由DownloadManager完成的;系統應用程序代表調用者應用程序執行此操作。要測試這一點,請從示例應用程序開始下載,強制關閉應用程序,打開下載管理器應用程序時,您將看到正在下載。 – gunar

相關問題