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