Administrador de descargas de Android: no puedo saber el tamaño de la descarga
-
21-12-2019 - |
Pregunta
Tengo problemas al intentar descargar archivos del servidor en una aplicación basada en WebView.Este código en realidad Funciona en un Galaxy S4 con android 4.4.2 pero no funciona en un Nexus 5 con la misma versión de Android.
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.toLowerCase().contains("video") || url.toLowerCase().contains("mp4")) {
String cookie = CookieManager.getInstance().getCookie(url);
DownloadManager mdDownloadManager = (DownloadManager) MainActivity.this
.getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.addRequestHeader("Cookie", cookie);
request.setDescription(getString(R.string.download_video));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle(getString(R.string.app_name));
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).mkdirs();
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, getFileName(url));
request.setMimeType("video/mp4");
mdDownloadManager.enqueue(request);
}
webViewPreviousState = PAGE_REDIRECTED;
view.loadUrl(appendAndroidClientIdentification(url));
return true;
}
Al inspeccionar los registros se encontró esto al intentar descargar un archivo a través del dispositivo Nexus 5:
I/DownloadManager﹕ Download 1755 starting
W/DownloadManager﹕ Aborting request for download 1755: can't know size of download, giving up
I/DownloadManager﹕ Download 1755 finished with status CANNOT_RESUME
Respuesta:
El problema estaba en el lado del servidor.Estaba usando el método send_data de Rails.Este método no envía ContentLength en los encabezados y este es el motivo del error en algunos dispositivos.
Para solucionar este problema simplemente agregue al aplicación.rb archivo :
config.middleware.use Rack::ContentLength
Solución
El problema estaba en el lado del servidor.Estaba usando el método send_data
de rieles.Este método no envía el ContentLength
en los encabezados y esta es la razón del error en algunos dispositivos.
Para solucionar este problema simplemente agregue al application.rb
:
config.middleware.use Rack::ContentLength