2012-01-25 22 views
6

Ho un'app che mostra una pagina HTML5 con un elemento video in una WebView. Mi ci è voluto un po 'per capire come far funzionare il video, ma alla fine sono riuscito a riprodurre il video incorporato in una WebView su un Samsung Galaxy Tab (Android 3.1). Ho usato il seguente codice per il tag video:Intercettazione della richiesta di origine video HTML5 in Android WebView

<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> 

L'elemento video ha più fonti e ora sto cercando di catturare la sorgente video selezionata (e formato) prima che il video inizia a giocare. Quando faccio clic sul pulsante di riproduzione, vedo una richiesta HTTP per il file video che arriva al server Web in cui sono archiviati i file video, ma non riesco a intercettare questa richiesta sul lato dell'app.

Ho esaminato diversi metodi per vedere se la richiesta per il file video è passata lì, ma non l'ho vista passare in nessuno di essi.

  • In shouldOverrideUrlLoading(WebView view, String url) nel mio WebViewClient viene passata solo la richiesta iniziale di pagina HTML5.
  • In shouldInterceptRequest (WebView view, String url) nel mio WebViewClient vedo solo passare la richiesta iniziale di pagina HTML5 e una richiesta per l'immagine del poster video, ma non per il file video.
  • onShowCustomView(View view, CustomViewCallback callback) nel mio WebChromeClient viene chiamato solo quando faccio clic sul pulsante di controllo a schermo intero sulla pagina HTML5 quando il video è già in riproduzione, ma non quando faccio clic sul pulsante di riproduzione. (Che cosa è in realtà lo scopo di questo metodo?)

Qualcuno ha un suggerimento per un altro metodo in cui posso catturare la richiesta per il file video o qualcuno mi può spiegare che cosa realmente accade quando si fa clic sul pulsante di riproduzione su l'elemento video?

+0

Puoi pubblicare il codice che utilizzi per il tag video. Recentemente mi sono occupata di questo e 'shouldOverrideUrlLoading (vista WebView, url String)' ha funzionato per me (in Gingerbread però). –

risposta

3

Ho risolto il problema utilizzando un approccio javascript. Quando viene caricata la pagina HTML, viene attivato un evento loadedmetadata quando i metadati del video sono stati caricati. Da quel momento in poi è possibile ottenere la sorgente video selezionata dall'attributo currentSrc dell'elemento video e passarla tramite un codice JavascriptInterface al codice nativo di Android.

Di seguito è riportato il codice dell'elemento video HTML5. "Android" è il nome con cui è possibile accedere a JavascriptInterface in 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> 

Il codice del 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 
    } 
} 

E infine aggiungere il JavascriptInterface al WebView al Activity momento della creazione

mWebView.addJavascriptInterface(new JavaScriptInterface(this), "Android"); 

E 'importante per catturare l'evento loadedmetadata aggiungendo l'attributo onloadedmetadata all'elemento video HTML5 e non registrando un listener di eventi al caricamento della pagina tramite addEventListener("loadedmetadata",...) perché su una rete veloce l'evento loadedmetadata può essere attivato prima che il listener sia registrato (vedere http://dev.opera.com/articles/view/consistent-event-firing-with-html5-video)

+0

Grazie per la soluzione, Erika; questo sembra proprio quello di cui ho bisogno anche io. – FractalBob

+0

Ho parlato troppo presto. Devo intercettare il pulsante Play la prima volta che viene premuto (sto scaricando il video una volta). Vedi un modo semplice per farlo? – FractalBob

+0

Hai mai trovato una soluzione "* reale *" per questo? Ho davvero bisogno di intercettare l'url perché nel mio caso l'evento non verrà mai attivato. –

Problemi correlati