Estoy armando una aplicación de cheapo que, entre otras cosas, "enmarca" algunos de nuestros sitios web ... Bastante simple con el WebViewClient
. hasta que llegue al video.
El video está hecho como HTML5
elementos, y estos funcionan bien en Chrome, iPhones, y ahora que solucionamos los problemas de codificación, funciona muy bien Android
en el navegador nativo.
Ahora el problema: WebView
no le gusta. En absoluto. Puedo hacer clic en la imagen del póster y no pasa nada.
En Google, encontré esto que está cerca, pero parece estar basado en un 'enlace' (como en un href ...) en lugar de un elemento de video. (onDownloadListener no parece ser invocado en elementos de video ...)
También veo referencias a la anulación de onShowCustomView, pero parece que no se llama a los elementos de video ... ni debería OververUrlLoading ...
Prefiero no entrar en "extraer xml del servidor, volver a formatearlo en la aplicación" ... manteniendo el diseño de la historia en el servidor, puedo controlar el contenido un poco mejor sin obligar a las personas a seguir actualizando una aplicación. Entonces, si puedo convencer a WebView para que maneje etiquetas como el navegador nativo, sería lo mejor.
Claramente me falta algo obvio ... pero no tengo idea de qué.
VideoEnabledWebView
aquí stackoverflow.com/questions/15768837/…Respuestas:
Respondo este tema en caso de que alguien lo lea y esté interesado en el resultado. Es posible ver un elemento de video (etiqueta video html5) dentro de un WebView, pero debo decir que tuve que lidiar con él durante unos días. Estos son los pasos que tuve que seguir hasta ahora:
-Buscar un video codificado correctamente
-Al iniciar el WebView, configure el JavaScript, los complementos del WebViewClient y el WebChromeClient.
- Maneje el onShowCustomView en el objeto WebChromeClient.
- Maneje los eventos onCompletion y onError para el video, para volver a la vista web.
Pero ahora debería decir que todavía hay un problema importante. Puedo jugarlo solo una vez. La segunda vez que hago clic en el despachador de video (ya sea el póster o algún botón de reproducción), no hace nada.
También me gustaría que el video se reproduzca dentro del marco de WebView, en lugar de abrir la ventana del reproductor de medios, pero esto es para mí un problema secundario.
Espero que ayude a alguien, y también agradecería cualquier comentario o sugerencia.
Saludos, terrícolas.
fuente
WebChromeClient
y anule los métodos correspondientes que necesita. Si insiste, puedo subir el resto de la clase más tarde cuando llegue a casa.Después de una larga investigación, conseguí que esto funcionara. Ver el siguiente código:
Test.java
HTML% VIDEO.java
custom_screen.xml
video_loading_progress.xml
colors.xml
Manifest.xml
Esperando el resto de las cosas que puedes entender.
fuente
La respuesta de mdelolmo fue increíblemente útil, pero como él dijo, el video solo se reproduce una vez y luego no puede abrirlo nuevamente.
Investigué un poco esto y esto es lo que encontré, en caso de que algún viajero cansado de WebView como yo tropiece con esta publicación en el futuro.
En primer lugar, miré la documentación de VideoView y MediaPlayer y tuve una mejor idea de cómo funcionan. Los recomiendo encarecidamente.
Luego, miré el código fuente para ver cómo lo hace el navegador de Android . Haz una página para buscar y ver cómo se manejan
onShowCustomView()
. Mantienen una referencia aCustomViewCallback
y a la vista personalizada.Con todo eso, y con la respuesta de mdelolmo en mente, cuando haya terminado con el video, todo lo que necesita hacer son dos cosas. Primero, en el
VideoView
que guardó una referencia, la llamadastopPlayback()
liberará elMediaPlayer
para ser utilizado más adelante en otro lugar. Puede verlo en el código fuente de VideoView . En segundo lugar, en elCustomViewCallback
que guardó una referencia para llamarCustomViewCallback.onCustomViewHidden()
.Después de hacer esas dos cosas, puede hacer clic en el mismo video o en cualquier otro video y se abrirá como antes. No es necesario reiniciar todo el WebView.
Espero que ayude.
fuente
En realidad, parece suficiente simplemente adjuntar un WebChromeClient de stock a la vista del cliente, ala
¡y necesita tener activada la aceleración de hardware!
Al menos, si no necesita reproducir un video a pantalla completa, no es necesario extraer el VideoView del WebView e insertarlo en la vista de la Actividad. Se reproducirá en el rectángulo asignado del elemento de video.
¿Alguna idea de cómo interceptar el botón expandir video?
fuente
Sé que este hilo tiene varios meses, pero encontré una solución para reproducir el video dentro de WebView sin hacerlo a pantalla completa (pero aún en el reproductor multimedia ...). Hasta ahora, no encontré ninguna pista sobre esto en Internet, así que tal vez esto también sea interesante para otros. Todavía estoy luchando por algunos problemas (es decir, colocar el reproductor multimedia en la sección correcta de la pantalla, no sé por qué lo estoy haciendo mal, pero creo que es un problema relativamente pequeño ...).
En el ChromeClient personalizado, especifique LayoutParams:
Mi método onShowCustomView se ve así:
Entonces, espero poder ayudar ... También tuve que jugar con la codificación de video y vi diferentes tipos de uso de WebView con video html5; al final, mi código de trabajo era una mezcla salvaje de diferentes partes de código que encontré en Internet y algunas cosas que tuve que resolver por mí mismo. Realmente fue un dolor en el a *.
fuente
Este enfoque funciona muy bien hasta 2.3 Y al agregar hardwareaccelerated = true incluso funciona desde 3.0 a ICS. Un problema que estoy enfrentando actualmente es el segundo lanzamiento de la aplicación del reproductor de medios que se bloquea porque no he detenido la reproducción y lanzado el reproductor de medios. Como el objeto VideoSurfaceView, que obtenemos en la función onShowCustomView desde el sistema operativo 3.0, es específico del navegador y no un objeto VideoView como hasta el sistema operativo 2.3 ¿Cómo puedo acceder a él y detener la reproducción y liberar recursos?
fuente
AM es similar a lo que hace BrowerActivity . para FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams (768, 512);
Creo que podemos usar
en lugar.
Otro problema que encontré es si el video se está reproduciendo, y el usuario hace clic en el botón Atrás, la próxima vez, vas a esta actividad (SingleTop one) y no puedes reproducir el video. para arreglar esto, llamé al
en el método onBackPressed de la actividad.
fuente
Sé que esta es una pregunta muy antigua, pero ¿ha probado el
hardwareAccelerated="true"
indicador de manifiesto para su aplicación o actividad?Con este conjunto, parece funcionar sin ninguna modificación de WebChromeClient (que esperaría de un elemento DOM).
fuente
hardwareAccelerated
comienza desde Android 3.0Utilicé html5webview para resolver este problema. Descargue y póngalo en su proyecto, luego puede codificar así.
Para hacer que el video sea giratorio, coloque el código android: configChanges = "orientación" en su Actividad, por ejemplo (Androidmanifest.xml)
y anular el método onConfigurationChanged.
fuente
Esta pregunta tiene años, pero tal vez mi respuesta ayude a personas como yo que tienen que admitir la versión anterior de Android. Probé muchos enfoques diferentes que funcionaron en algunas versiones de Android, pero no en todas. La mejor solución que encontré es usar Crosswalk Webview, que está optimizado para admitir funciones HTML5 y funciona en Android 4.1 y versiones posteriores. Es tan simple de usar como el Android WebView predeterminado. Solo tienes que incluir la biblioteca. Aquí puede encontrar un tutorial simple sobre cómo usarlo: https://diego.org/2015/01/07/embedding-crosswalk-in-android-studio/
fuente
Bueno, aparentemente esto no es posible sin usar un JNI para registrar un complemento para obtener el evento de video. (Personalmente, estoy evitando los JNI ya que realmente no quiero lidiar con un desastre cuando salgan las tabletas Android basadas en Atom en los próximos meses, perdiendo la portabilidad de Java).
La única alternativa real parece ser crear una nueva página web solo para WebView y hacer videos de la vieja escuela con un enlace A HREF como se cita en la URL de Codelark anterior.
Icky
fuente
En uso de panal
hardwareaccelerated=true
ypluginstate.on_demand
parece funcionarfuente
Tuve un problema similar. Tenía archivos y videos HTML en la carpeta de activos de mi aplicación.
Por lo tanto, los videos se ubicaron dentro del APK. Debido a que el APK es realmente un archivo ZIP, WebView no pudo leer los archivos de video.
Copiar todos los archivos HTML y de video en la tarjeta SD funcionó para mí.
fuente