WebView и в HTML5

Я собираю дешевое приложение, которое, среди прочего," фреймы " некоторых наших веб-сайтов... Довольно просто с WebViewClient. пока не попал на видео.

видео сделано как HTML5 элементы, и они отлично работают и Денди на Chrome, iPhones, и теперь, когда мы исправили проблемы кодирования, он отлично работает на Android в собственном браузере.

сейчас руб.: WebView не нравится. Совсем. Я могу нажать на изображение плаката, и ничего происходит.

погуглив, я нашел этой который близок, но, похоже, основан на "ссылке" (как в href...) вместо элемента видео. (onDownloadListener не кажется вам ссылаться на видео элементы...)

Я тоже вижу ссылки на переопределение onShowCustomView, но это, кажется, не дозвонились на видео элементы... не shouldOverrideUrlLoading..

Я бы предпочел не попасть в "вытащить xml с сервера, переформатировать его в приложении".. сохраняя макет истории на сервере, я могу управлять контентом немного лучше, не заставляя людей обновлять приложение. Поэтому, если я смогу убедить WebView обрабатывать теги, такие как собственный браузер, это будет лучше всего.

Я явно упускаю что-то очевидное.. но я понятия не имею, что.

13 ответов


я отвечаю на эту тему на всякий случай, если кто-то прочитал ее и интересуется результатом. Можно просмотреть элемент видео (тег video html5) в WebView, но я должен сказать, что мне пришлось иметь дело с ним в течение нескольких дней. Это шаги, которые я должен был следовать до сих пор:

-найти правильно закодированное видео

- при инициализации WebView установите JavaScript, Плагины WebViewClient и WebChromeClient.

url = new String("http://broken-links.com/tests/video/"); 
mWebView = (WebView) findViewById(R.id.webview);
mWebView.setWebChromeClient(chromeClient);
mWebView.setWebViewClient(wvClient);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setPluginState(PluginState.ON);
mWebView.loadUrl(url);

-ручка onShowCustomView в Объект WebChromeClient.

@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
    super.onShowCustomView(view, callback);
    if (view instanceof FrameLayout){
        FrameLayout frame = (FrameLayout) view;
        if (frame.getFocusedChild() instanceof VideoView){
            VideoView video = (VideoView) frame.getFocusedChild();
            frame.removeView(video);
            a.setContentView(video);
            video.setOnCompletionListener(this);
            video.setOnErrorListener(this);
            video.start();
        }
    }
}

-обработайте onCompletion и события onError для видео, чтобы вернуться к веб-представлению.

public void onCompletion(MediaPlayer mp) {
    Log.d(TAG, "Video completo");
    a.setContentView(R.layout.main);
    WebView wb = (WebView) a.findViewById(R.id.webview);
    a.initWebView();
}

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

Я также хотел бы, чтобы видео воспроизводилось внутри фрейма WebView, а не открывало окно Media Player, но это для меня это второстепенная проблема.

Я надеюсь, что это поможет кому-то, и я бы также поблагодарил любой комментарий или предложение.

Saludos, terrícolas.


после долгих исследований, я получил эту вещь работать. См. следующий код:


ответ mdelolmo был невероятно полезен, но, как он сказал, видео воспроизводится только один раз, а затем вы не можете открыть его снова.

Я посмотрел на это немного, и вот что я нашел, в случае, если какие-либо усталые путешественники WebView, как я наткнуться на этот пост в будущем.

во-первых, я посмотрел на видео просмотр и медиаплеердокументация и получил лучшее представление о том, как они работают. Я настоятельно рекомендую их.

затем, Я посмотрел на исходный код, чтобы увидеть, как браузер Android это делает. Сделать страницу найти и пойти посмотреть, как они работают onShowCustomView(). Они держат ссылку на CustomViewCallbackи к пользовательскому представлению.

со всем этим, и с ответом mdelolmo в виду, когда вы закончите с видео, все, что вам нужно сделать, это две вещи. Во-первых, на VideoView что вы сохранили ссылку на, call stopPlayback() это освободит MediaPlayer будет использоваться позже в другом месте. Вы можете увидеть его в видео просмотр исходный код. Во-вторых, на CustomViewCallback вы сохранили ссылку на call CustomViewCallback.onCustomViewHidden().

после выполнения этих двух вещей вы можете нажать на то же видео или любое другое видео, и оно откроется, как и раньше. Нет необходимости перезапускать весь WebView.

надеюсь, что это поможет.


на самом деле, кажется достаточным просто прикрепить фондовый WebChromeClient к представлению клиента, ala

mWebView.setWebChromeClient(new WebChromeClient());

и вам нужно включить аппаратное ускорение!

по крайней мере, если вам не нужно воспроизводить полноэкранное видео, нет необходимости вытаскивать видеообзор из WebView и вставлять его в представление активности. Он будет воспроизводиться в выделенной прямой кишке видеоэлемента.

есть идеи как перехватить кнопку развернуть видео?


Я знаю, что этому потоку несколько месяцев, но я нашел решение для воспроизведения видео внутри WebView, не делая его полноэкранным (но все еще в медиаплеере...). До сих пор я не нашел никакого намека на это в интернете, поэтому, возможно, это также интересно для других. Я все еще борюсь за некоторые проблемы (т. е. размещение медиаплеера в правой части экрана, не знаю, почему я делаю это неправильно, но это относительно небольшая проблема, я думаю...).

в обычай ChromeClient указать LayoutParams:

// 768x512 is the size of my video
FrameLayout.LayoutParams LayoutParameters = 
                                     new FrameLayout.LayoutParams (768, 512); 

мой метод onShowCustomView выглядит следующим образом:

public void onShowCustomView(final View view, final CustomViewCallback callback) {
     // super.onShowCustomView(view, callback);
     if (view instanceof FrameLayout) {
         this.mCustomViewContainer = (FrameLayout) view;
         this.mCustomViewCallback = callback;
         this.mContentView = (WebView) this.kameha.findViewById(R.id.webview);
         if (this.mCustomViewContainer.getFocusedChild() instanceof VideoView) {
             this.mCustomVideoView = (VideoView) 
                                     this.mCustomViewContainer.getFocusedChild();
             this.mCustomViewContainer.setVisibility(View.VISIBLE);
             final int viewWidth = this.mContentView.getWidth();
             final int viewLeft = (viewWidth - 1024) / 2;
             // get the x-position for the video (I'm porting an iPad-Webapp to Xoom, 
             // so I can use those numbers... you have to find your own of course...
             this.LayoutParameters.leftMargin = viewLeft + 256; 
             this.LayoutParameters.topMargin = 128;
             // just add this view so the webview underneath will still be visible, 
             // but apply the LayoutParameters specified above
             this.kameha.addContentView(this.mCustomViewContainer, 
                                             this.LayoutParameters); 
             this.mCustomVideoView.setOnCompletionListener(this);
             this.mCustomVideoView.setOnErrorListener(this);
             // handle clicks on the screen (turning off the video) so you can still
             // navigate in your WebView without having the video lying over it
             this.mCustomVideoView.setOnFocusChangeListener(this); 
             this.mCustomVideoView.start();
         }
     }
 }

Итак, я надеюсь, что смогу помочь... Я тоже должен был играть с кодированием видео и видел различные виды использования WebView с видео html5 - в конце концов мой рабочий код был диким сочетанием разных частей кода, которые я нашел в интернете, и некоторые вещи, которые я должен был выяснить сам. Это действительно была боль в*.


этот подход работает очень хорошо до 2.3 И, добавив hardwareaccelerated=true, он даже работает от 3.0 до ICS Одна из проблем, с которой я сталкиваюсь в настоящее время, заключается в том, что при втором запуске приложения media player происходит сбой, потому что я не остановил воспроизведение и выпустил Media player. Поскольку объект VideoSurfaceView, который мы получаем в функции onShowCustomView от 3.0 OS, специфичен для браузера, а не для объекта VideoView, как в, до 2.3 OS Как я могу получить доступ к нему и stopPlayback и release ресурсы?


A-M похож на то, что BrowerActivity делает. для Так.LayoutParams LayoutParameters = новый FrameLayout.LayoutParams (768, 512);

Я думаю, мы можем использовать

FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT,
            FrameLayout.LayoutParams.FILL_PARENT) 

вместо.

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

try { 
    mCustomVideoView.stopPlayback();  
    mCustomViewCallback.onCustomViewHidden();
} catch(Throwable e) { //ignore }

в деятельности метод onBackPressed.


Я знаю, что это очень старый вопрос, но вы пробовали hardwareAccelerated="true" флаг манифеста для вашего приложения или деятельности?

С этим набором он, похоже, работает без какой-либо модификации WebChromeClient (которую я ожидал бы от DOM-элемента.)


Я html5webview чтобы решить эту проблему.Загрузите и поместите его в свой проект, тогда вы можете кодировать так же, как это.

private HTML5WebView mWebView;
String url = "SOMEURL";
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mWebView = new HTML5WebView(this);
    if (savedInstanceState != null) {
            mWebView.restoreState(savedInstanceState);
    } else {
            mWebView.loadUrl(url);
    }
    setContentView(mWebView.getLayout());
}
@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    mWebView.saveState(outState);
}

чтобы сделать видео вращающимся, поместите код android: configChanges= "ориентация" в свою деятельность например (Androidmanifest.в XML)

<activity android:name=".ui.HTML5Activity" android:configChanges="orientation"/>

и переопределить метод onConfigurationChanged.

@Override
public void onConfigurationChanged(Configuration newConfig) {
     super.onConfigurationChanged(newConfig);
}

этот вопрос лет, но, возможно, мой ответ поможет людям, как я, которые должны поддерживать старую версию Android. Я пробовал много разных подходов, которые работали на некоторых версиях Android, однако не на всех. Лучшее решение, которое я нашел, - использовать Пешеходный Переход Webview, который оптимизирован для поддержки HTML5 и работает на Android 4.1 и выше. Он так же прост в использовании, как и Android WebView по умолчанию. Вы просто должны включить библиотеку. Здесь вы можете найти простые руководство по использованию это: https://diego.org/2015/01/07/embedding-crosswalk-in-android-studio/


на соте используйте hardwareaccelerated=true и pluginstate.on_demand Кажется, что работает


У меня была похожая проблема. У меня были HTML-файлы и видео в папке assets моего приложения.

поэтому видео были расположены внутри APK. Поскольку APK действительно является ZIP-файлом, WebView не смог прочитать видеофайлы.

копирование всех HTML-и видеофайлов на SD-карту работало для меня.


ну, по-видимому, это просто невозможно без использования JNI для регистрации плагина для получения видео-события. (Лично я избегаю JNI, так как я действительно не хочу иметь дело с беспорядком, когда планшеты Android на основе Atom выйдут в ближайшие несколько месяцев, потеряв переносимость Java.)

единственной реальной альтернативой, по-видимому, является создание новой веб-страницы только для WebView и видео старой школы со ссылкой HREF, как указано в url-адресе Codelark выше.

бяка.