WebView и HTML5 <видео>

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

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

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

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

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

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

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

 Wolfpack'0822 окт. 2012 г., 10:24
В том же духе я ищу HTML5-плеер для моего сайта. Что я должен использовать?
 cprcrack15 июл. 2013 г., 16:20
Мой ответ здесь:stackoverflow.com/a/16179544/423171
 EpicPandaForce26 нояб. 2014 г., 14:29
Ничего не помогло, поэтому я посмотрелVideoEnabledWebView Вотstackoverflow.com/questions/15768837/...
 BoD25 нояб. 2011 г., 13:28
Посмотри пожалуйста:code.google.com/p/android/issues/detail?id=22254

Ответы на вопрос(13)

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

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

Прежде всего, я посмотрел наVideoView а такжеМедиа-плейерДокументация и получил лучшее представление о том, как они работают. Я настоятельно рекомендую их.

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

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

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

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

 Gonan18 янв. 2013 г., 21:31
Решил это! Я просто удалил «если», которое проверяет, является ли это экземпляром ViewView. Наконец я могу воспроизводить видео в обычном размере и полноэкранном режиме! : D
 MacD04 апр. 2013 г., 14:53
В конце концов мне удалось добавить: @Override public void onStop () {super.onStop (); mWebView.destroy (); } к деятельности ... решающее значение имеет webview.destroy ()
 michiakig24 янв. 2012 г., 20:12
Поиск кода Google был удален, я думаю, что эта версия BrowserActivity.java (от Froyo) примерно соответствует описанной здесь:github.com/android/platform_packages_apps_browser/blob/...
 Gonan18 янв. 2013 г., 13:59
Проблема, с которой я сталкиваюсь, заключается в том, что я возвращаюсь из frame.getFocusedChild (); является HTml5VideoView вместо ViewView, и поэтому все это не работает для меня и не может переключиться в полноэкранный режим :( Я на Android 4.1.2.
 mxcl22 мар. 2012 г., 19:56
Связанный код @ spacemanki не содержит упоминаний о VideoView во всем репо. Я думаю, BrowserActivity делает это по-другому. Я даже вернулся к выпуску Эклера. Не могу найти применение.
 mdelolmo10 янв. 2011 г., 08:57
На самом деле я тоже вроде решил, просто не запостил решение (позор мне). Точно так же, как и вам, мне пришлось взглянуть на код браузера Android, и, ну, не так много, чтобы добавить, я вместо этого использовал слушатель onCompletion, чтобы остановить проигрыватель, и пару раз мне пришлось установить видимость, но я бы купил ваше решение. С уважением!

я использовал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 = "direction" в свою активность, например (Androidmanifest.xml)

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

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

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

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

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

Icky.

добавляя аппаратное ускорение = true, он работает даже с 3.0 до ICS. Одна проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что при втором запуске приложения медиаплеера происходит сбой, потому что я не остановил воспроизведение и не выпустил медиаплеер. Поскольку объект VideoSurfaceView, который мы получаем в функции onShowCustomView из ОС 3.0, специфичен для браузера, а не для объекта VideoView, как в ОС до версии 2.3. Как я могу получить к нему доступ, остановитьPlayback и освободить ресурсы?

что этой теме уже несколько месяцев, но я нашел решение для воспроизведения видео внутри 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 - в конце концов мой рабочий код представлял собой дикое сочетание различных частей кода, которые я нашел в Интернет и некоторые вещи, которые я должен был выяснить сам. Это действительно была боль в *.

 Pascal16 апр. 2013 г., 20:11
В ICS getFocusedChild () не возвращает VideoView. Любая идея о том, как заставить это работать на ICS?
Решение Вопроса

если кто-то прочитает ее и заинтересован в результате. Можно просмотреть элемент видео (тег HTML 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, но для меня это второстепенная проблема.

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

Салудос, терриколы.

 vuhung399026 мая 2014 г., 04:18
. Wv.getSettings () setPluginState (PluginState.ON); // новое обновление
 Collin Price08 мар. 2012 г., 04:21
что такое "а"? как эта деятельность это будет?
 desgraci11 июл. 2012 г., 16:02
Можете ли вы предоставить класс?
 Swap-IOS-Android24 февр. 2013 г., 18:33
Пожалуйста, поделитесь полным рабочим кодом
 cottonBallPaws09 янв. 2011 г., 05:49
Спасибо, Мделольмо! Я попытался выяснить проблему с этим, играя только один раз, и я написал это в ответе на этот вопрос.
 Gennadiy Ryabkin04 мар. 2014 г., 10:52
@mdelolmo, если фрагмент инициализирует веб-просмотр из WebChromeClient и выделяет память для клиента в том же фрагменте, поэтому он не будет работать
 Gennadiy Ryabkin28 февр. 2014 г., 16:32
a.initWebView () что это> ??
 brian moore09 окт. 2010 г., 00:44
спасибо, mdelolmo! который заставил мой onShowCustomView работать ... придется поиграть с ним. Обратите внимание, что эмулятор (по крайней мере, в Linux) вообще не любит проигрывать видео, даже то, что настоящий андроид будет играть хорошо. А кодирование - это немного больно ... потребовалось некоторое время, чтобы все настроить здесь, чтобы дроиды могли транслироваться.
 Odin05 мар. 2014 г., 09:54
Вы тоже решили мою проблему, спасибо :)
 pengwang08 окт. 2010 г., 04:59
Я не запускаю никаких результатов, мой экран черный. я хочу знать, если это нужно thead. мой код слишком длинный для размещения здесь. Можете ли вы дать мне какой-либо способ связи или открыть другую тему.
 mdelolmo04 мар. 2014 г., 09:55
@zest Если я правильно помню, запускается первый фрагмент, a является экземпляром действия, в котором размещается веб-просмотр.
 Petr Peller09 мая 2014 г., 10:38
a.setContentView(video); Как получить экземпляр активности в моем WebChromeClient? Должен ли я передать его в конструкторе?
 mdelolmo11 июл. 2012 г., 16:28
@Collin Price a является экземпляром Activity, где размещается веб-просмотр. @desgraci, я могу предоставить это, но кроме этого есть немного. Расширить классWebChromeClient и переопределите соответствующие методы, которые вам нужны. Если вы настаиваете, я могу загрузить остальные классы позже, когда вернусь домой.
 Akarsh M27 февр. 2014 г., 11:43
эта строка дает мне ошибку mWebView.getSettings (). setPluginsEnabled (true); все время ... почему ???
 Roel16 февр. 2016 г., 17:41
Что это на самом деле делает? Удалите видеоплеер из макета и добавьте его снова ... Как это может помочь?
 mdelolmo08 окт. 2010 г., 16:49
Вы полностью уверены, что проблема не в кодировке? Попробуйте с URL, который я разместил. Очевидно это должно работать с родным браузером
 mdelolmo09 мая 2014 г., 10:41
@PetrPeller, я думаю, что это то, что я сделал, да, но моя память может перестать работать через 4 года :)
 Pascal16 апр. 2013 г., 20:09
Не работает на ICS, поскольку getFocusedChild () - это не VideoView, а HTML5VFullScreen $ SurfaceVideoView. Любая идея о том, как сделать на ICS? (увидетьstackoverflow.com/questions/13540654/...

hardwareAccelerated="true" Флаг манифеста для вашего приложения или деятельности?

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

 vbence04 янв. 2012 г., 20:56
hardwareAccelerated начинается с Android 3.0
 Pong Petrung24 нояб. 2017 г., 13:20
хороший братан спасибо

BrowerActivity делает. для FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams (768, 512);

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

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

вместо.

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

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

в методе действия onBackPressed.

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

mWebView.setWebChromeClient(new WebChromeClient());

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

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

Есть идеи, как перехватить кнопку расширения видео?

 Paulo Cesar22 июн. 2012 г., 21:16
Работал здесь, спасибо!
 mxcl22 мар. 2012 г., 19:59
Не работал для меня
 Ethan_AI13 нояб. 2014 г., 19:09
Пожалуйста, укажите, какая версия Android. Это работает по-разному для разных версий.
 Frank17 дек. 2013 г., 12:05
вы можете перехватить его, используя WebChromeClient и переопределив onShowCustomView

д:

Test.java

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;

public class Test extends Activity {

    HTML5WebView mWebView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mWebView = new HTML5WebView(this);

        if (savedInstanceState != null) {
            mWebView.restoreState(savedInstanceState);
        } else {    
            mWebView.loadUrl("http://192.168.1.18/xxxxxxxxxxxxxxxx/");
        }

        setContentView(mWebView.getLayout());
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mWebView.saveState(outState);
    }

    @Override
    public void onStop() {
        super.onStop();
        mWebView.stopLoading();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (mWebView.inCustomView()) {
                mWebView.hideCustomView();
            //  mWebView.goBack();
                //mWebView.goBack();
                return true;
            }

        }
        return super.onKeyDown(keyCode, event);
    }
}

HTML% VIDEO.java

package com.ivz.idemandtest;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.webkit.GeolocationPermissions;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;

public class HTML5WebView extends WebView {

    private Context                             mContext;
    private MyWebChromeClient                   mWebChromeClient;
    private View                                mCustomView;
    private FrameLayout                         mCustomViewContainer;
    private WebChromeClient.CustomViewCallback  mCustomViewCallback;

    private FrameLayout                         mContentView;
    private FrameLayout                         mBrowserFrameLayout;
    private FrameLayout                         mLayout;

    static final String LOGTAG = "HTML5WebView";

    private void init(Context context) {
        mContext = context;     
        Activity a = (Activity) mContext;

        mLayout = new FrameLayout(context);

        mBrowserFrameLayout = (FrameLayout) LayoutInflater.from(a).inflate(R.layout.custom_screen, null);
        mContentView = (FrameLayout) mBrowserFrameLayout.findViewById(R.id.main_content);
        mCustomViewContainer = (FrameLayout) mBrowserFrameLayout.findViewById(R.id.fullscreen_custom_content);

        mLayout.addView(mBrowserFrameLayout, COVER_SCREEN_PARAMS);

        // Configure the webview
        WebSettings s = getSettings();
        s.setBuiltInZoomControls(true);
        s.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
        s.setUseWideViewPort(true);
        s.setLoadWithOverviewMode(true);
      //  s.setSavePassword(true);
        s.setSaveFormData(true);
        s.setJavaScriptEnabled(true);
        mWebChromeClient = new MyWebChromeClient();
        setWebChromeClient(mWebChromeClient);

        setWebViewClient(new WebViewClient());

setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);

        // enable navigator.geolocation 
       // s.setGeolocationEnabled(true);
       // s.setGeolocationDatabasePath("/data/data/org.itri.html5webview/databases/");

        // enable Web Storage: localStorage, sessionStorage
        s.setDomStorageEnabled(true);

        mContentView.addView(this);
    }

    public HTML5WebView(Context context) {
        super(context);
        init(context);
    }

    public HTML5WebView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public HTML5WebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    public FrameLayout getLayout() {
        return mLayout;
    }

    public boolean inCustomView() {
        return (mCustomView != null);
    }

    public void hideCustomView() {
        mWebChromeClient.onHideCustomView();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if ((mCustomView == null) && canGoBack()){
                goBack();
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    private class MyWebChromeClient extends WebChromeClient {
        private Bitmap      mDefaultVideoPoster;
        private View        mVideoProgressView;

        @Override
        public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback)
        {
            //Log.i(LOGTAG, "here in on ShowCustomView");
            HTML5WebView.this.setVisibility(View.GONE);

            // if a view already exists then immediately terminate the new one
            if (mCustomView != null) {
                callback.onCustomViewHidden();
                return;
            }

            mCustomViewContainer.addView(view);
            mCustomView = view;
            mCustomViewCallback = callback;
            mCustomViewContainer.setVisibility(View.VISIBLE);
        }

        @Override
        public void onHideCustomView() {
            System.out.println("customview hideeeeeeeeeeeeeeeeeeeeeeeeeee");
            if (mCustomView == null)
                return;        

            // Hide the custom view.
            mCustomView.setVisibility(View.GONE);

            // Remove the custom view from its container.
            mCustomViewContainer.removeView(mCustomView);
            mCustomView = null;
            mCustomViewContainer.setVisibility(View.GONE);
            mCustomViewCallback.onCustomViewHidden();

            HTML5WebView.this.setVisibility(View.VISIBLE);
            HTML5WebView.this.goBack();
            //Log.i(LOGTAG, "set it to webVew");
        }


        @Override
        public View getVideoLoadingProgressView() {
            //Log.i(LOGTAG, "here in on getVideoLoadingPregressView");

            if (mVideoProgressView == null) {
                LayoutInflater inflater = LayoutInflater.from(mContext);
                mVideoProgressView = inflater.inflate(R.layout.video_loading_progress, null);
            }
            return mVideoProgressView; 
        }

         @Override
         public void onReceivedTitle(WebView view, String title) {
            ((Activity) mContext).setTitle(title);
         }

         @Override
         public void onProgressChanged(WebView view, int newProgress) {
             ((Activity) mContext).getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress*100);
         }

         @Override
         public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
             callback.invoke(origin, true, false);
         }
    }


    static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS =
        new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

custom_screen.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2009 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android">
    <FrameLayout android:id="@+id/fullscreen_custom_content"
        android:visibility="gone"
        android:background="@color/black"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    />
    <LinearLayout android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout android:id="@+id/error_console"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
        />

        <FrameLayout android:id="@+id/main_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
        />
    </LinearLayout>
</FrameLayout>

video_loading_progress.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2009 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in com,pliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/progress_indicator"
         android:orientation="vertical"
         android:layout_centerInParent="true"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content">

       <ProgressBar android:id="@android:id/progress"
           style="?android:attr/progressBarStyleLarge"
           android:layout_gravity="center"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content" />

       <TextView android:paddingTop="5dip"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="center"
           android:text="@string/loading_video" android:textSize="14sp"
           android:textColor="?android:attr/textColorPrimary" />
 </LinearLayout>

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
/* //device/apps/common/assets/res/any/http_authentication_colors.xml
**
** Copyright 2006, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License"); 
** you may not use this file except in compliance with the License. 
** You may obtain a copy of the License at 
**
**     http://www.apache.org/licenses/LICENSE-2.0 
**
** Unless required by applicable law or agreed to in writing, software 
** distributed under the License is distributed on an "AS IS" BASIS, 
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
** See the License for the specific language governing permissions and 
** limitations under the License.
*/
-->
<!-- FIXME: Change the name of this file!  It is now being used generically
    for the browser -->
<resources>
    <color name="username_text">#ffffffff</color>
    <color name="username_edit">#ff000000</color>

    <color name="password_text">#ffffffff</color>
    <color name="password_edit">#ff000000</color>

    <color name="ssl_text_label">#ffffffff</color>
    <color name="ssl_text_value">#ffffffff</color>

    <color name="white">#ffffffff</color>
    <color name="black">#ff000000</color>



    <color name="geolocation_permissions_prompt_background">#ffdddddd</color>
</resources>

manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.test"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Test"
                  android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            android:configChanges="orientation|keyboardHidden|keyboard">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>  
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
</manifest>

Ожидая остальных вещей, вы можете понять.

 George Baker29 дек. 2012 г., 00:26
Этот должен быть принятым ответом. Сурендра и Маленький, вы оба спасли мое здравомыслие. Отлично сработало для меня.
 Vishal Kumar20 нояб. 2014 г., 05:23
Большое спасибо ! Попробовав несколько предложений .. Это, наконец, сработало для меня !!!
 Abhilash19 июл. 2017 г., 15:33
Это то, что я искал точно так же, как нативный браузер. Спасибо Тоне Сурендре и Маленкому.
 Milad Faridnia13 дек. 2015 г., 13:03
Работал отлично. большое спасибо ;)
 Sahil26 июл. 2013 г., 11:15
Это дает мне белый пустой экран на Nexus 7 (Android 4.1). Есть идеи как это исправить?
 Yuriy Ashaev16 янв. 2013 г., 19:30
Я согласен с Джорджем. Именно так работает собственный браузер Android с VideoView. Кажется, это тот же код, что и здесьcode.google.com/p/html5webview, Он отлично работает для всех версий Android (я тестировал на Android 2.2 и выше). Единственное, что я хотел заметить, вы должны иметь в виду, что если вы измените целевой SDK на что-то выше 13, то ваша активность будет воссоздана при смене ориентации. Чтобы избежать этого, либо добавьте screenSize в android: configChanges (но в этом случае вам потребуется использовать min sdk <13) или использовать старый целевой SDK (тогда вы можете оставить android: configChanges)
 Pedro Lobito07 апр. 2014 г., 06:12
Кнопка не останавливает видео, и звук все еще слышен, есть идеи, как это исправить?

ктивов моего приложения.

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

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

hardwareaccelerated=true а такжеpluginstate.on_demand похоже на работу

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

 slhck06 февр. 2019 г., 11:07
Примечание: пешеходный переходне поддерживается больше.

Ваш ответ на вопрос