2012-01-25 4 views
6

У меня есть приложение, которое показывает страницу HTML5 с элементом видео в WebView. Мне потребовалось некоторое время, чтобы понять, как заставить видео работать, но, наконец, мне удалось воспроизвести видео, встроенное в WebView на вкладке Samsung Galaxy Tab (Android 3.1). Я использовал следующий код для видео тега:Перехват запроса источника видео HTML5 в 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> 

видео элемент имеет несколько источников, и теперь я пытаюсь захватить выбранный источник видеосигнала (и формат) до того, как видео начинает играть. Когда я нажимаю кнопку воспроизведения, я вижу HTTP-запрос для видеофайла, поступающего на веб-сервер, где хранятся видеофайлы, но мне не удается перехватить этот запрос на стороне приложения.

Я просмотрел несколько методов, чтобы проверить, проходит ли запрос на видеофайл, но я не видел, чтобы он проходил в любом из них.

  • В моем WebViewClient только мой исходный запрос HTML5 проходит.
  • В shouldInterceptRequest (WebView view, String url) в моем WebViewClient Я вижу только передачу начального запроса на страницу HTML5 и запрос на видеоролик, но не для видеофайла.
  • onShowCustomView(View view, CustomViewCallback callback) в моем WebChromeClient вызывается только при нажатии кнопки полноэкранного управления на странице HTML5, когда видео уже воспроизводится, но не при нажатии кнопки воспроизведения. (Какова на самом деле цель этого метода?)

У кого-нибудь есть предложение по другому методу, где я могу захватить запрос на видеофайл или кто-нибудь может объяснить мне, что на самом деле происходит, когда я нажимаю кнопку воспроизведения на элемент видео?

+0

Можете ли вы разместить код, который вы используете для видеотега. Я совсем недавно занимался этим, и 'shouldOverrideUrlLoading (WebView view, String url)' работал для меня (в Gingerbread, хотя). –

ответ

3

Я решил проблему, используя подход javascript. Когда загружается страница HTML, при загрузке метаданных видео происходит событие loadedmetadata. С этого момента вы можете получить выбранный источник видео из атрибута currentSrc видеоэлемента и передать его через JavascriptInterface в собственный код Android.

Ниже приведен код элемента видео HTML5. «Android» - это имя, с помощью которого можно получить доступ к JavascriptInterface в 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> 

Артикул 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 
    } 
} 

И, наконец, добавить JavascriptInterface в WebView на активность время создания

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

Очень важно, чтобы поймать loadedmetadata событие, добавив атрибут onloadedmetadata к элементу видео HTML5, а не регистрации регистратора событий при загрузке страницы через addEventListener("loadedmetadata",...), потому что в быстрой сети событие loadedmetadata может быть запущено до регистрации слушателя (см. http://dev.opera.com/articles/view/consistent-event-firing-with-html5-video)

+0

Спасибо за ваше решение, Эрика; это похоже на то, что мне нужно. – FractalBob

+0

Я говорил слишком рано. Мне нужно перехватить кнопку «Воспроизведение» при первом нажатии (я загружаю видео один раз). Вы видите простой способ сделать это? – FractalBob

+0

Вы когда-нибудь находили решение «* real *» для этого? Мне действительно нужно перехватить URL-адрес, потому что в моем случае событие никогда не будет запущено. –

Смежные вопросы