DownloadManager descarga de archivos de más de 2,1 GB

Estoy trabajando en una aplicación y una de las características que estoy trabajando es descargar algunos archivos binarios. Algunos de ellos son realmente grandes (más de varios mega-bytes). Las descargas están terminando bien siempre y cuando el tamaño del archivo sea inferior a 2 GB.

Me quedé atrapado en un archivo que es de 3,2 GB en el que tengo actualizaciones de progreso (estoy agrupando el DownloadManager para las actualizaciones de progreso), pero cuando la descarga se completa, el archivo no está presente en la ruta del archivo de destino. Interrogando el DownloadManager para esa identificación de la transferencia directa, consigo STATUS_FAILED y la razón ERROR_UNKNOWN – los detalles del error del favorito uno desea siempre para!

Lo extraño es que esto aparece en la mayoría de los dispositivos, pero para algunos (como Samsung SG 4 Active OS 4.2.2 y LG Nexus 5 OS 4.4.2), no aparece.

Haciendo una investigación adicional, descubrí que esto parece ser un error en la implementación de Android DownloadManager . Parece que la implementación de Android almacena el recuento de descargas como un int, pero cuando ese recuento va por encima de Integer.MAX_VALUE la descarga finaliza como si fallara.

Estoy pensando en reemplazar el uso de DownloadManager con un servicio de primer plano, pero no me daría por vencido aún ….

¿Ustedes se enfrentan a esto y si es así, ¿cómo lo solucionó? ¿Hay algún trabajo alrededor de usar DownloadManager en pre-4.2.2 para que pueda descargar más de 2,1 GB por archivo?

Para descargar archivos tan grandes, necesita descargarlos en trozos. Puede utilizar cualquier biblioteca que admita opciones de rango HTTP para permitir que despliegue un único archivo en varias piezas, respaldo, etc.

O puede dividir su archivo grande en su servidor y luego tener un archivo de texto con hash MD5 de cada archivo, cuando primero empiece a descargar y luego obtener el archivo MD5 una vez finalizar y luego comprobar que hashes coincide con las piezas descargadas. Si no lo hacen entonces eliminar esa pieza y añadirlo a la cola de los elementos para descargar.

Una vez que todas las piezas descargadas y MD5 funciona, puede poner las piezas de nuevo juntos como archivo único.

Si está pensando en descargar el archivo en la tarjeta SD, entonces FAT32 es el sistema de archivos predeterminado. Hay un límite de 4 GB por archivo con este sistema de archivos.

Al mirar el código fuente de Android, parece que este problema se resolvió en JB-MR2.

Parece que la única manera de evitar esto en las versiones más antiguas de la plataforma sería modificar el servidor de manera que utilice la codificación de transferencia en bloques [1] para estos grandes recursos. En ese caso, que Download Manager ignorará y no intentará analizar el encabezado Content-Length.

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

Hay un resultado claro de esto:

No se puede arreglar el DownloadManager . Si es un error, será así. Por lo tanto, en resumen, no , no se puede solucionar este problema mediante el DownloadManager . Sin embargo, se podría evitarlo utilizando un enfoque del lado del servidor que se ha puesto en palabras en las otras respuestas.

Por lo tanto, creo que su solución más simple sería forzar el nivel mínimo de sdk a JB-MR2 porque @ksasq mencionó que este problema se ha resuelto.

Si eso no es plausible ni en su caso posible, usted puede encontrar la mejor biblioteca de descarga de archivos por ahí y crear una interfaz similar a DownloadManager para esta biblioteca. Por supuesto, esta interfaz debe ser implementada para usar el DownloadManager por defecto para las versiones que no tienen este error y usar la biblioteca personalizada para aquellos que tenían este error (y para los archivos que causan el problema si es posible).

Desafortunadamente, una búsqueda en google mostró el android-download-manager de yingyixu actualizado por última vez en 2012.

Otra desafortunada nota sobre este tema por CommonsWare simplemente verifica que no hay DownloadManager en las bibliotecas de soporte de google. Lo peor es que el tipo renunció a la idea de implementar su propio puerto porque era demasiado complicado. Sólo puedes esperar que la biblioteca de yingyixu o alguna otra biblioteca que esperes encontrar sea lo suficientemente buena.

Puede pasar este problema dividiendo el archivo en archivos zip más pequeños. El siguiente paso es unirlos a la meta, he encontrado -> esto <- que podría ayudarte. Si no va a comprimir archivo (opción de división sólo) debe tener un buen rendimiento. Otro problema es que necesitará el doble de espacio de almacenamiento. Puede descargar archivos más pequeños, unos 100MB, escribirlo en el buffer unido y eliminar el sistema de archivos de formulario, que preservará el espacio perdido.

También puede tomar la versión fija de DownloadManager , cambiar el paquete a la estructura del paquete y utilizar esta versión en lugar de la versión del sistema. Eventualmente, necesitará importar algunas clases del paquete original android.app . A continuación, registre su implementación como un servicio.

  • Cómo utilizar DownloadManager en ArrayAdapter
  • DownloadManager - recibido ACTION_DOWNLOAD_COMPLETE, pero el estado es STATUS_RUNNING
  • Pausar android DownloadManager
  • Obtener el nombre de archivo de los encabezados con DownloadManager en Android
  • Android: Problema con el gestor de descargas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.