2012-01-25 32 views
6

我有一個應用程序,它在WebView中顯示帶有視頻元素的HTML5頁面。我花了一段時間才弄清楚如何讓視頻工作,但最終我成功地在三星Galaxy Tab(Android 3.1)上播放嵌入在WebView中的視頻。我用下面的代碼,視頻標籤:在Android WebView中攔截HTML5視頻源請求

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

視頻元素有多個來源,現在我想之前視頻開始播放捕捉到選定的視頻源(和格式)。當我點擊播放按鈕時,我看到視頻文件到達存儲視頻文件的網絡服務器的HTTP請求,但是我沒有成功在應用程序端攔截此請求。

我看了幾個方法,看看是否通過視頻文件的請求,但我沒有看到它通過任何一個。

  • shouldOverrideUrlLoading(WebView view, String url)我的WebViewClient中只有最初的HTML5頁面請求通過。
  • shouldInterceptRequest (WebView view, String url)在我的WebViewClient我看到只傳遞HTML5頁面的初始請求和視頻海報圖像的請求,但不是視頻文件。
  • onShowCustomView(View view, CustomViewCallback callback)我的WebChromeClient僅在單擊HTML5頁面上的全屏控制按鈕時纔會被調用,當視頻已經播放時,但不是當我單擊播放按鈕時。 (究竟是該方法的目的是什麼?)

沒有任何人有另一種方法的建議,我可以捕捉視頻文件的請求或任何人都可以解釋我到底發生了什麼,當我點擊播放按鈕視頻元素?

+0

您可以發佈您用於視頻標記的代碼嗎?我最近處理了這個問題,'shouldOverrideUrlLoading(WebView視圖,String url)'爲我工作(儘管在薑餅中)。 –

回答

3

我使用javascript方法解決了這個問題。加載HTML頁面時,會在加載視頻元數據時觸發loadedmetadata事件。從那一刻起,您可以從視頻元素的currentSrc屬性中獲取所選視頻源,並通過JavascriptInterface將其傳遞給Android本機代碼。

下面是HTML5視頻元素的代碼。 「Android」是可通過javascript訪問JavascriptInterface的名稱。

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

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

最後的代碼在活動創建時通過添加onloadedmetadata屬性JavascriptInterface添加到的WebView

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

重要的是要抓住loadedmetadata事件到HTML5視頻元素,而不是在頁面加載時通過註冊事件偵聽器10因爲在快速網絡上,loadedmetadata事件可能在聽衆註冊之前觸發(請參閱http://dev.opera.com/articles/view/consistent-event-firing-with-html5-video

+0

感謝您的解決方案,Erika;這看起來正是我所需要的。 – FractalBob

+0

我說得太快了。第一次按下時我需要攔截「播放」按鈕(我正在下載視頻一次)。你看到一個簡單的方法來做到這一點? – FractalBob

+0

您是否曾經爲此找到過「*真實*」解決方案?我真的需要攔截網址,因爲在我的情況下,事件永遠不會被觸發。 –