Interceptar solicitud de fuente de video HTML5 en Android WebView
Tengo una aplicación que muestra una página HTML5 con un elemento de vídeo en un WebView. Me tomó un tiempo para averiguar cómo conseguir el trabajo de vídeo, pero finalmente tuve éxito para reproducir el video incrustado en un WebView en un Samsung Galaxy Tab (Android 3.1). He utilizado el siguiente código para la etiqueta de vídeo:
<video controls poster="img/poster.jpg" height="240" width="360"> <source src="video/BigBuck.m4v"> <source src="video/BigBuck.theora.ogv" type="video/ogg"> <source src="video/BigBuck.webm" type="video/webm"> HTML5 video not supported. </video>
El elemento de vídeo tiene varias fuentes y ahora intento capturar la fuente de video seleccionada (y el formato) antes de que el video comience a reproducirse. Cuando hago clic en el botón de reproducción, veo una solicitud HTTP para el archivo de vídeo que llega al servidor web donde se almacenan los archivos de vídeo, pero no logro interceptar esta solicitud en el lado de la aplicación.
- ¿Cómo buscar el contenido del sitio web y ponerlo en la forma en que queremos en el diseño de la aplicación para Android?
- Android Crosswalk Lite - Integración con Android Studio
- ¿Hay alguna manera de hacer que una vista web que ejecuta android 4.0 se realice a un nivel aceptable?
- Desactivar el enlace automático de Webview
- HTC One X - Webview se convierte en blanco / vacío después del toque
Miré varios métodos para ver si la solicitud para el archivo de vídeo pasa allí, pero no lo vi pasar en ninguno de ellos.
- En
shouldOverrideUrlLoading(WebView view, String url)
en miWebViewClient
solo se pasa la solicitud de página HTML5 inicial. - En
shouldInterceptRequest (WebView view, String url)
en miWebViewClient
veo sólo pasar la solicitud de página HTML5 inicial y una solicitud para la imagen de póster de vídeo, pero no para el archivo de vídeo. -
onShowCustomView(View view, CustomViewCallback callback)
en miWebChromeClient
sólo se llama cuando hago clic en el botón de control de pantalla completa en la página HTML5 cuando el video ya se está reproduciendo pero no cuando hago clic en el botón de reproducción. (¿Cuál es realmente el propósito de este método?)
¿Alguien tiene una sugerencia para otro método en el que puedo capturar la solicitud para el archivo de vídeo o alguien me puede explicar lo que realmente sucede cuando hago clic en el botón de reproducción en el elemento de vídeo?
- Android carga los datos html en las pestañas personalizadas de cromo
- Habilitación de JavaScript general en WebViewClient
- Selección de texto de Android en la vista web
- Uncaught ReferenceError, Llamando función javascript a través de la aplicación android ..?
- Jellybean / ICS Método de publicación HTTP Android + WebView.RestoreState
- Abrir un menú de carga de archivos en una vista web no funciona
- La vista web de Android conserva los datos del formulario cuando cambia la orientación
- ¿Por qué mi WebView no llena el ancho completo de mi pantalla?
He resuelto el problema utilizando un enfoque de javascript. Cuando se carga la página HTML, se carga un evento loadedmetadata
cuando se han cargado los metadatos de vídeo. A partir de ese momento, puedes obtener la fuente de video seleccionada del atributo currentSrc
del elemento de video y pasarla a través de JavascriptInterface
al código nativo de Android.
A continuación se muestra el código del elemento de vídeo HTML5. "Android" es el nombre por el cual se puede acceder a JavascriptInterface en javascript.
<video poster="image/poster.jpg" height="240" width="360" onloadedmetadata="Android.interceptPlay(this.currentSrc);"> <source src="video/BigBuck.m4v"> <source src="video/BigBuck.webm" type="video/webm"> <source src="video/BigBuck.theora.ogv" type="video/ogg"> HTML5 video not supported. </video>
El código de JavascriptInterface
private class JavaScriptInterface { Context mContext; /* Instantiate the interface and set the context */ JavaScriptInterface(Context c) { mContext = c; } public void interceptPlay(String source) { // do something } }
Y finalmente agregue JavaScriptInterface al WebView en el momento de la creación de la actividad
mWebView.addJavascriptInterface(new JavaScriptInterface(this), "Android");
Es importante capturar el evento loadedmetadata
agregando el atributo onloadedmetadata
al elemento de video HTML5 y no registrando un oyente de evento en carga de página a través de addEventListener("loadedmetadata",...)
porque en una red rápida el evento loadedmetadata
se puede disparar antes El oyente está registrado (consulte http://dev.opera.com/articles/view/consistent-event-firing-with-html5-video )
- Descargar un archivo con DefaultHTTPClient y autenticación preventiva
- ¿Cómo puedo probar Android Market Filtering antes de publicar mi aplicación?