¿Cómo puedo usar Android para descargar un archivo basado en sesión / cookie usando webView?
Estoy tratando de descargar un archivo usando webView de hosts de archivos (como zippyshare.com). El problema es que no puedo usar intenciones para abrir un navegador, o redirigirlo a través de DownloadManager, ya que es sesión / cookie basado, y el lanzamiento de esos métodos redirecciona el archivo zip en el archivo html original para volver a descargar.
He intentado:
- Cómo desplazarse mediante programación WebView de Android
- Pantalla en blanco de Android en onBack en un archivo loadDataWithBaseURL
- Webview dentro de NestedScrollView causa problema de altura
- Reproducción de vídeo local en WebView en Android
- El video de YouTube no se abre en webView
Uri source = Uri.parse(url); DownloadManager.Request request = new DownloadManager.Request(source); String cookie = CookieManager.getInstance().getCookie(url); request.addRequestHeader("Set-Cookie", cookie); request.addRequestHeader("User-Agent", view.getSettings().getUserAgentString()); request.addRequestHeader("Accept", "text/html, application/xhtml+xml, *" + "/" + "*"); request.addRequestHeader("Accept-Language", "en-US,en;q=0.7,he;q=0.3"); request.addRequestHeader("Referer", url); // Use the same file name for the destination final File destinationDir = new File (Environment.getExternalStorageDirectory(), cordova.getActivity().getPackageName()); if (!destinationDir.exists()) { destinationDir.mkdir(); // Don't forget to make the directory if it's not there } File destinationFile = new File (destinationDir, source.getLastPathSegment()); Log.e("FILEPOSITION", Uri.fromFile(destinationFile).toString()); request.setDestinationUri(Uri.fromFile(destinationFile)); // Add it to the manager manager.enqueue(request);
y:
Bundle bundle = new Bundle(); String cookie = CookieManager.getInstance().getCookie(url); bundle.putString("cookie", cookie); bundle.putString("User-Agent", view.getSettings().getUserAgentString()); Intent intent = new Intent(Intent.ACTION_VIEW ,Uri.parse(url)); intent.putExtra(Browser.EXTRA_HEADERS, bundle); cordova.getActivity().startActivity(intent);
Para tratar de preservar la cookie, y mientras veo los encabezados se envían muy bien, todavía se redirige al enlace html, lo que me lleva a creer que es la sesión basada.
¿Hay una manera de descargar un archivo de esa manera?
- Aplicación android se estrella en el cambio de url de vista web
- Los menús desplegables de selección de HTML no funcionan en la vista web de Android
- Mantener sesión de cookie en Android
- ¿Cómo puedo desplazar un WebView a un punto específico en Android
- "Hola, WebView" tutorial abre la dirección solicitada en el navegador de Android y no en mi webview
- Tamaño de fuente de Android WebView en píxeles
- Colocación de contenido HTML en dos columnas dentro de WebView
- Utilice una barra de acción contextual personalizada para la selección de texto de WebView
Yo estaba lidiando con el mismo problema y me las arreglé para conseguir su primera solución de trabajo, sólo con un ligero cambio. Simplemente reemplaza Set-Cookie
Cookie
:
request.addRequestHeader("Cookie", cookie);
Por cierto. Basada en sesión significa que los datos de autenticación no se almacenan en las cookies, pero en el lado del servidor, identificado por una clave, que se almacena en las cookies. Así que en realidad no importa si se basa en la sesión o no, las cookies se utilizan en ambos casos.
También he probado la segunda solución (es más simple), pero de lo que he leído parece que Browser.EXTRA_HEADERS
es compatible sólo con el navegador predeterminado de Android. Así que si el usuario tiene un navegador diferente en su dispositivo, no funcionará.
Esta es una vieja pregunta pero espero que ayude a alguien.
- Abrir URL de Facebook con la aplicación de Facebook
- Instalar referrer no está rastreando en el mercado web android