He estado luchando para cargar archivos desde WebView desde los últimos días y no hay progreso. Busqué en Google e implementé todas las soluciones sugeridas, pero ninguna funciona, como: soluciones sugeridas aquí , y así sucesivamente.
Problema: Tengo una página HTML con el siguiente código para cargar un archivo. Funciona bien en un navegador de escritorio como Firefox y en el navegador integrado de emulador / AVD, es decir, cuando hago clic en el botón "Examinar ..." representado por elemento, el navegador abre un cuadro de diálogo donde puedo elegir un archivo para cargar.
Sin embargo, en el emulador de Android 3.0 / AVD, cuando hago clic en "Elegir archivo", ¡no pasa nada, no se abre ningún diálogo de archivo!
<form method="POST" enctype="multipart/form-data">
File to upload: <input type="file" name="uploadfile">
<input type="submit" value="Press to Upload..."> to upload the file!
</form>
¿Podría alguien sugerir una posible solución lo antes posible?
fuente
Webview
subclase que maneja la carga de archivos, etc. automáticamente: github.com/delight-im/Android-AdvancedWebViewAdvancedWebView.isFileUploadAvailable()
si las cargas son compatibles. Y puede compartir su código y pedir ayuda en los problemas: github.com/delight-im/Android-AdvancedWebView/issuesRespuestas:
Esta es una solución completa para todas las versiones de Android, también tuve dificultades con esto.
También quiero agregar que la "página de carga" como la de este ejemplo, no funcionará en <4 versiones, ya que tiene una función de vista previa de imagen, si desea que funcione use una carga PHP simple sin vista previa.
Actualización :
Encuentre la solución para dispositivos lollipop aquí y gracias por gauntface
Actualización 2 :
Solución completa para todos los dispositivos Android hasta oreo aquí y esta es una versión más avanzada , deberías buscarla, tal vez pueda ayudar.
fuente
progressBar
parece no utilizado allí. Solo puedo ver que se esconde, pero no donde está activado. Creo que deberías agregaronProgressChanged(...)
a laWebChromeClient
variante personalizada para eso. (Y algo parecidogetWindow().setFeatureInt( Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);
aonCreate
.)Método de trabajo de HONEYCOMB (API 11) a Oreo (API 27)
[No probado en Pie 9.0]
Modificado
onActivityResult()
Ahora en
onCreate()
oonCreateView()
pegue el siguiente códigofuente
¡Esta es la única solución que encontré que funciona!
fuente
En 5.0 Lollipop, Google agregó un método oficial, WebChromeClient.onShowFileChooser . Incluso proporcionan una manera de generar automáticamente la intención del selector de archivos para que use la entrada de aceptar tipos mime.
Para las versiones de Android anteriores a KitKat, los métodos privados mencionados en las otras respuestas funcionan. No he encontrado una buena solución para KitKat (4.4).
fuente
uploadMessage.onReceiveValue()
funciona y tiene un cierre)
Descubrí que necesitaba 3 definiciones de interfaz para manejar varias versiones de Android.
fuente
Esta solución también funciona para Honeycomb y Ice Cream Sandwich. Parece que Google introdujo una nueva característica genial (aceptar atributo) y olvidó implementar una sobrecarga para la compatibilidad con versiones anteriores.
fuente
La solución completa de hifarrer es muy útil para mí.
pero encontré muchos otros problemas: admitir otro tipo de mime, enumerar dispositivos de captura (cámara, video, grabadora de audio), abrir el dispositivo de captura de inmediato (por ejemplo, <input accept = "image / *; capture">) ...
Entonces, hice una solución que funciona exactamente igual que la aplicación de navegador web predeterminada.
Usé android-4.4.3_r1 / src / com / android / browser / UploadHandler.java. (gracias a Rupert Rawnsley)
cadena adicional resoruce de res / values / string.xml:
Si está utilizando proguard, es posible que necesite la siguiente opción en proguard-project.txt:
ACTUALIZACIÓN # 1 (2015.09.09)
agrega código para la compatibilidad de Android 5.0.1.
fuente
Esto es trabajo para mi. También trabajo para turrón y malvavisco [ [
fuente
Me pareció necesario definir
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture)
, en Android 4.1. Luego seguí la solución de Michel Olivier.fuente
De hecho, he logrado que el selector de archivos aparezca en Kitkat, para seleccionar una imagen y obtener la ruta del archivo en el resultado de la actividad, pero lo único que no puedo "arreglar" (causa esta solución) es hacer que la entrada archivada se llene fuera con los datos del archivo.
¿Alguien sabe de alguna manera cómo acceder al campo de entrada desde una actividad? Estoy usando este comentario de ejemplo . Es solo esta última pieza, el último ladrillo en la pared que solo tengo que colocar en el lugar correcto (aunque podría activar la carga del archivo de imagen directamente desde el código.
ACTUALIZACIÓN # 1
No soy un desarrollador de Android hardcore, así que mostraré el código en el nivel de novato. Estoy creando una nueva actividad en una actividad ya existente
Parte manifestada
Estoy creando mi clase BrowseActivity a partir de esta respuesta de ejemplo . La instancia de WebChromeClient () se ve básicamente igual, excepto la última pieza, que activa la parte de la interfaz de usuario del selector ...
Y algunas cosas mas
}
Por último, un poco más de código para obtener la ruta real del archivo, el código que se encuentra en SO, también agregué la URL de la publicación en los comentarios para que el autor obtenga créditos por su trabajo.
Por último, la página HTML necesita activar ese nuevo método de showPicker (específicamente cuando está en A4.4)
fuente
El propio navegador de Google ofrece una solución tan completa para este problema que garantiza su propia clase:
Implementación de openFileChooser en Android 4.0.4
Clase UploadHandler en Android 4.0.4
fuente
2019: este código funcionó para mí (probado en los androides 5-9).
La esperanza puede ayudarte.
fuente
¡Encontré una SOLUCIÓN que funciona para mí! Agregue una regla más en el archivo
proguard-android.txt
:fuente
Solución Kotlin para Android 8:
Constantes:
Configuración de WebView:
Y la parte onAcrtivityResult:
Por favor, preste atención a que nuestra variable de intención se llama "datos".
fuente
¿Has visitado estos enlaces? http://groups.google.com/group/android-developers/browse_thread/thread/dcaf8b2fdd8a90c4/62d5e2ffef31ebdb
http://moazzam-khan.com/blog/?tag=android-upload-file
http://evgenyg.wordpress.com/2010/05/01/uploading-files-multipart-post-apache/
Ejemplo conciso de carga de archivos a través de Java lib Apache Commons
creo que obtendrás ayuda de esto
fuente
En KitKat puede usar el Marco de acceso de almacenamiento.
Marco de acceso al almacenamiento / Escribir una aplicación de cliente
fuente
Webview: elegir archivos individuales y múltiples
Necesita dos minutos para implementar este código:
build.gradle
código java:
fuente
Soy nuevo en Andriod y luché con esto también. De acuerdo con la Guía de referencia de Google WebView.
Código de ejemplo que ejecuté en MainActvity.java.
Ejecutado
fuente
Investigué sobre este tema durante casi un mes. Todo falló. Todos los códigos vistos en múltiples sitios web no funcionan bien. Pero aquí existe la mejor solución.
https://github.com/chiclaim/android-webview-upload-file
Pasos
1) Haga clic en clonar o descargue
2) Obtenga el archivo zip en su directorio local
3) descomprimir el archivo zip
4) Abra el estudio de Android
5) Ir a archivo ----> Abrir ---> Navegar al directorio donde descomprimió el contenido.
6) Cambie la url web requerida en webView.loadUrl ("your url hre"); en MainActivity.java
7) Funciona bien con la versión Android studio 3.4.2
fuente