Перехват запроса источника видео HTML5 в Android WebView - PullRequest
6 голосов
/ 25 января 2012

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

<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, когда видео уже воспроизводится, но не когда я нажимаю кнопку воспроизведения.(Какова цель этого метода?)

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

1 Ответ

3 голосов
/ 23 февраля 2012

Я решил проблему, используя подход 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)

...