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.

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 mi WebViewClient solo se pasa la solicitud de página HTML5 inicial.
  • En shouldInterceptRequest (WebView view, String url) en mi WebViewClient 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 mi WebChromeClient 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?

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 )

  • Alcanzar el límite de ancho de banda para ver archivos pdf en WebView a través de Google Docs
  • xamarin android webview ya no recupera la página servida localmente con httplistener
  • Android: Guardar XWalkView - Estado de la pasarela
  • Android WebView parece ignorar la información de "vista gráfica" en las páginas web
  • Detectar el cambio de ubicación de la URL de webview de Android
  • Android youtube en la vista web
  • Cómo desactivar el efecto de rebote (tono azul cuando se desplaza hasta el final) de la vista web en android?
  • Hacer AppBarLayout responder a desplazamiento en WebView
  • ¿Cómo descargar archivos de Android de vista web?
  • OnKeyDown dentro del fragmento WebView
  • Responder sitio web mostrar en la vista Web fuera de ancho móvil (no sensible) de otra manera en Chrome se ve bien
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.