DownloadManager загружает файлы более 2,1 ГБ

Я работаю над приложением, и одна из функций, над которыми я работаю, – это загрузка некоторых двоичных файлов. Некоторые из них действительно большие (более нескольких мегабайт). Загрузки заканчиваются нормально, пока размер файла составляет менее 2 ГБ.

Я застрял в файле размером 3,2 ГБ, чтобы получить обновления для процесса обновления (я собираю DownloadManager для обновлений выполнения), но когда загрузка завершена, файл отсутствует в пути к целевому файлу. Опросив DownloadManager для этого идентификатора загрузки, я получаю STATUS_FAILED и причину ERROR_UNKNOWN – излюбленные детали ошибки, которые когда-либо пожелают!

Странно, что это появляется на большинстве устройств, но для некоторых (например, Samsung SG 4 Active OS 4.2.2 и LG Nexus 5 OS 4.4.2) он не появляется.

Сделав некоторое дополнительное исследование, я узнал, что это, похоже, ошибка в реализации Android DownloadManager . Похоже, что реализация Android хранит счетчик загрузки как int, но когда этот счет идет выше Integer.MAX_VALUE загрузка заканчивается как неудачная.

Я собираюсь заменить использование DownloadManager на передний план, но я бы не сдался …

Вы, ребята, столкнулись с этим, и если да, то как вы это исправили? Есть ли необходимость в использовании DownloadManager в пред-4.2.2, поэтому я могу загрузить более 2,1 ГБ на файл?

Solutions Collecting From Web of "DownloadManager загружает файлы более 2,1 ГБ"

Чтобы загрузить такие большие файлы, вам нужно загрузить их в куски. Либо вы можете использовать любую библиотеку, которая поддерживает параметры диапазона HTTP, позволяющие вытаскивать один файл в нескольких частях, поддерживая возобновление и т. Д.

Или вы можете разделить свой большой файл на своем сервере, а затем иметь текстовый файл с хешем MD5 каждого файла, когда вы сначала начнете загружаться, затем получите файл MD5 после завершения, затем проверьте, что хеши соответствуют загруженным фрагментам. Если они этого не сделают, удалите эту часть и добавьте ее в очередь элементов для загрузки.

После того, как все куски загружены и MD5, вы можете собрать фрагменты вместе в виде одного файла.

Если вы хотите загрузить файл на SD-карту, то FAT32 будет файловой системой по умолчанию. В этой файловой системе есть ограничение по 4 ГБ на файл.

От взгляда на исходный код Android, похоже, эта проблема была решена в JB-MR2.

Кажется, что единственный способ обойти это на более старых версиях платформы – это изменить сервер таким образом, чтобы для этих больших ресурсов использовалась кодированная передача кодирования [1]. В этом случае Менеджер загрузки игнорирует и не пытается проанализировать заголовок Content-Length.

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

Есть один явный итог:

Вы не можете исправить DownloadManager . Если это ошибка, это будет так. Поэтому, короче говоря, нет , вы не можете обойти эту проблему с помощью DownloadManager . Однако вы могли бы обойти это, используя подход на стороне сервера, который был добавлен в слова в других ответах.

Итак, я думаю, что вашим самым простым решением было бы заставить минимальный уровень sdk для JB-MR2, потому что @ksasq упомянул, что эта проблема решена.

Если это не правдоподобно и в вашем случае возможно, вы можете найти лучшую библиотеку загрузки файлов и создать интерфейс, аналогичный DownloadManager для этой библиотеки. Разумеется, этот интерфейс должен быть реализован для использования DownloadManager по умолчанию для версий, которые не имеют этой ошибки, и используют специальную библиотеку для тех, у кого была эта ошибка (и для файлов, которые вызывают проблему, если это возможно).

К сожалению, поиск в google показал yingyixu's android-download-manager, последний раз обновленный в 2012 году.

Другая неудачная заметка об этой теме CommonsWare просто проверяет, нет ли DownloadManager в библиотеках поддержки Google. Хуже всего то, что парень отказался от идеи реализовать свой собственный порт, потому что это было слишком сложно. Вы можете только надеяться, что библиотека yingyixu или какая-то другая библиотека, которую мы надеемся найти, достаточно хороша.

Вы можете передать эту проблему, разделив файл на более мелкие zip-файлы. Следующий шаг – объединить их в цель, я нашел -> этот <-, который может вам помочь. Если вы не будете сжимать файл (опция только для разделения), вы должны иметь хорошую производительность. Другая проблема заключается в том, что вам потребуется вдвое больше места для хранения. Вы можете загружать файлы меньшего размера, около 100 МБ, записывать их в объединенный буфер и удалять файловую систему формы, что позволит сэкономить пространство.

Вы также можете воспользоваться фиксированной версией DownloadManager , изменить пакет на свою структуру пакета и использовать эту версию вместо системной версии. В конце концов вам нужно импортировать некоторые классы из исходного пакета android.app . Затем зарегистрируйте свою реализацию как услугу.