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, а не открывало окно медиаплеера, но это это для меня второстепенный вопрос.
Я надеюсь, что это поможет кому-то, и я также хотел бы поблагодарить любой комментарий или предложение.
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/
У меня была похожая проблема. У меня были HTML-файлы и видео в папке активов моего приложения.
поэтому видео были расположены внутри APK. Поскольку APK действительно является ZIP-файлом, WebView не смог прочитать видео-файлы.
копирование всех HTML-и видео-файлов на SD-карту работало для меня.
ну, по-видимому, это просто невозможно без использования JNI для регистрации плагина, чтобы получить видео-событие. (Лично я избегаю JNI, так как я действительно не хочу иметь дело с беспорядком, когда в ближайшие несколько месяцев выйдут Android-планшеты на базе Atom, потеряв переносимость Java.)
единственной реальной альтернативой, по-видимому, является создание новой веб-страницы только для WebView и видео по старой школе со ссылкой a HREF, как указано в url-адресе Codelark выше.
бяка.
Comments