studio sistema propiedades example descargar codigo android android-webview

sistema - webview android studio 2018



¿Descargar una URL de objeto en una vista web de Lollipop? (1)

David, he investigado esto. Tienes un buen desafío aquí. El problema es que el DownloadListener realmente está esperando un URI (ex http://server.com/file.pdf ). Sin embargo, el enlace en el que el usuario hace clic no pasa un URI en ese formato. La URL pasada representa un blob que se adjunta al DOM del navegador. Como resultado, la solución no funcionará como fue diseñada.

Puede tener otra opción. Depende de cómo está generando los bytes para el blob. Mencionaste que lo estás haciendo en Javascript. Si es así, omitiría el uso de Blob y URL.createObjectURL completamente y escribiría una interfaz Javascript / Native que le permitirá transferir los bytes en trozos (n número de arreglos de 255 bytes, por ejemplo) al código de Java. Esto mantendrá el consumo de memoria en el cliente.

Tengo una idea sobre cómo crear la interfaz, pero primero necesito entender cómo está generando los bytes para el blob. Si puede publicar una matriz de bytes, puedo usar eso para probar mi solución. Házmelo saber.

En una vista web de Android Lollipop, quiero que el usuario descargue un archivo txt generado:

// Store some text in a data URL. var dataUrl = (window.URL || window.webkitURL).createObjectURL( new Blob(["Hello world. :)"])); // Create a link that lets the user download the text file as hello.txt. var downloadLink = document.createElement(''a''); downloadLink.setAttribute(''href'', dataUrl); downloadLink.innerHTML = ''Click to download.''; // Working with David on this. I did the same thing. // Fyi, setting the ''download'' attribute just makes hitting the link // nop, ie. do nothing at all in the web view, so I omitted it. // - John // Display the link. document.getElementById(''container'').appendChild(downloadLink);

En el lado de Android de Java, escribí un DownloadListener que intenta usar DownloadManager para descargar el archivo:

package com.somesideprojects; import android.webkit.DownloadListener; /** * A download listener that lets users download files from the web view. */ public class CustomDownloadListener implements DownloadListener { private MainActivity currentActivity; @Override public void onDownloadStart( String url, String userAgent, String contentDisposition, String mimeType, long contentLength) { android.util.Log.d("Logger", "url : " + url + " userAgent: " + userAgent + " contentDisposition: " + contentDisposition + " mimeType: " + mimeType + " contentLength " + contentLength); android.net.Uri source = android.net.Uri.parse(url); // Make a new request. android.app.DownloadManager.Request request = new android.app.DownloadManager.Request(source); // Appears the same in notification bar while downloading. String filename = getFilename(contentDisposition); request.setDescription( "This project will be saved in your downloads folder as " + filename + "."); request.setTitle(filename); // Add cookie on request header (for authenticated web app). String cookieContent = getCookieFromAppCookieManager(source.getHost()); request.addRequestHeader("Cookie", cookieContent); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { request.allowScanningByMediaScanner(); request.setNotificationVisibility( android.app.DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); } // Save the file in the "Downloads" folder of SDCARD. request.setDestinationInExternalPublicDir( android.os.Environment.DIRECTORY_DOWNLOADS, filename); // Get the download service and enqueue the file. android.app.DownloadManager manager = (android.app.DownloadManager) this.currentActivity.getApplication() .getSystemService(android.content.Context.DOWNLOAD_SERVICE); manager.enqueue(request); } public String getFilename(String contentDisposition){ String filename[] = contentDisposition.split("filename="); return filename[1].replace("filename=", "").replace("/"", "").trim(); }; public String getCookieFromAppCookieManager(String url){ android.webkit.CookieManager cookieManager = android.webkit.CookieManager.getInstance(); if (cookieManager == null) { return null; } String rawCookieHeader = null; // Extract Set-Cookie header value from Android app CookieManager for this URL rawCookieHeader = cookieManager.getCookie(url); if (rawCookieHeader == null) { return null; } return rawCookieHeader; }; public void setCurrentActivity(MainActivity currentActivity) { this.currentActivity = currentActivity; } }

Este error de Java aparece cuando hago clic en el enlace en la vista web:

java.lang.IllegalArgumentException: Can only download HTTP/HTTPS URIs: blob:file%3A///f566c1cf-b0b2-4382-ba16-90bab359fcc5 at android.app.DownloadManager$Request.<init>(DownloadManager.java:429)

Recibí el mismo error cuando alojé mi página en un servidor HTTP, por lo que el error parece provenir de la parte blob: .

Cuáles son mis opciones ahora? ¿Cómo puedo descargar los datos almacenados en la URL del objeto? En última instancia, quiero descargar un blob mucho más grande (~ 50MB).

Podría pasar los datos a un objeto inyectado en addJavascriptInterface , pero tendría que codificar en base64 mi blob y decodificar en el lado de java (ya que solo se pueden pasar tipos primitivos y simples). La codificación en base64 a través de javascript bloquea Chromium para blobs de 50 MB (salgo de los errores de memoria al llamar a readAsDataURL ).

¿De qué otra manera podría descargar el blob de 50MB desde la vista web? ¿O transfiere los datos binarios de 50MB de javascript a java de Android?

== Detalles en caso de uso ==

Estoy usando javascript para generar un blob de archivo de video de 50MB con video/x-ms-wmv tipo mime video/x-ms-wmv . Esta generación es completamente del lado del cliente. Confío en que este paso funcione, ya que puedo descargar el archivo en un navegador de escritorio (así como a través de la aplicación Chrome normal) a través de una URL de objeto . Luego quiero dejar que el usuario almacene ese archivo en su almacenamiento externo (tal vez en DCIM o Descargas).

En una nota no relacionada, también me gustaría hacer lo mismo con los archivos de audio WAV (por ejemplo, generar tonos de timbre para almacenar en tonos de timbre).