WebView и HTML5



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



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



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



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



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



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



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

823   13  

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, а не открывало окно медиаплеера, но это это для меня второстепенный вопрос.

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

Saludos, terrícolas.

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

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

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

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

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

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

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

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

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

mWebView.setWebChromeClient(new WebChromeClient());

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

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

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

Я знаю, что этой теме уже несколько месяцев, но я нашел решение для воспроизведения видео внутри 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-файлы и видео в папке активов моего приложения.

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

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

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

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

бяка.

Comments

    Ничего не найдено.