WebView та HTML5 <відео>


122

Я спільно використовую додаток cheapo, який серед іншого "обрамляє" деякі наші веб-сайти ... Досить просто з WebViewClient. поки я не потрапив на відео.

Відео зроблено як HTML5 елементи, і вони працюють чудово та просто в Chrome, iPhones, і тепер, коли ми вирішили проблеми кодування, на яких він чудово працює Androidу рідному браузері.

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

Погуглити, я знайшов це що близько, але , здається, на основі «лінії» (як в HREF ...) замість відеоелемент. (Обліковий запис onDownloadListener не викликається на елементах відео ...)

Я також бачу посилання на перевизначення OnShowCustomView, але це, схоже, не викликає відеоелементів ... а також не повинноOverrideUrlLoading ..

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

Я чітко пропускаю щось очевидне .. але у мене немає поняття, що.



У цій же лінії я шукаю програвач HTML5 для свого веб-сайту. Що я повинен використовувати?
Wolfpack'08

1
Моя відповідь тут: stackoverflow.com/a/16179544/423171
cprcrack

1
Нічого не виходило , так що я подивився в VideoEnabledWebViewтут stackoverflow.com/questions/15768837 / ...
EpicPandaForce

Відповіді:


92

Я відповідаю на цю тему на випадок, якщо хтось її прочитає і зацікавиться результатом. Можна переглядати відео елемент (тег video html5) в WebView, але я мушу сказати, що мені довелося з ним боротися протягом декількох днів. Це кроки, які мені довелося виконувати до цих пір:

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

-При ініціалізації WebView встановіть JavaScript, плагіни WebViewClient та WebChromeClient.

url = новий рядок ("http://broken-links.com/tests/video/"); 
mWebView = (WebView) findViewById (R.id.webview);
mWebView.setWebChromeClient (chromeClient);
mWebView.setWebViewClient (wvClient);
mWebView.getSettings (). setJavaScriptEnabled (вірно);
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, але це для мене другорядне питання.

Я сподіваюся, що це комусь допоможе, і я також подякував би за будь-який коментар чи пропозицію.

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


Я не запускаю жодного результату, мій екран чорний. Я хочу знати, чи потрібна ця Теда. мій код занадто довгий для розміщення тут .може ви дасте мені контактний спосіб або відкриєте іншу тему.
pengwang

Ви повністю впевнені, що це не проблема кодування? Спробуйте з URL-адресою, яку я опублікував. Очевидно, що він повинен працювати з рідним браузером
mdelolmo

46
що таке "а"? як би ця діяльність була б?
Ціна Колліна

1
@Collin Price a - це приклад діяльності, що розміщує веб-перегляд. @desgraci, я можу це надати, але окрім цього не багато. Зробіть розширення класу WebChromeClientта замініть відповідні потрібні вам методи. Якщо ви наполягаєте, я можу завантажувати решту класу пізніше, коли повернусь додому.
mdelolmo

6
Не працює на ICS, оскільки getFocusedChild () - це не VideoView, а HTML5VFullScreen $ SurfaceVideoView. Будь-яка ідея, як це зробити на ICS? (див. stackoverflow.com/questions/13540654/…
Паскаль

61

Після довгих досліджень я цю справу працював. Дивіться наступний код:

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 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.
-->

<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>

кольори.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>

Очікуючи решту речей, які ви можете зрозуміти.


7
Це має бути прийнятою відповіддю. Ви обидва врятували мою розум Сурендру та Маленкію. Для мене чудово працювали.
Джордж Бейкер

Я згоден з Джорджем. Саме так працює рідний браузер Android з VideoView. Здається, це той самий код, що і тут code.google.com/p/html5webview . Він чудово працює для всіх версій Android (я тестував на Android 2.2 і вище). Тільки одне, що я хотів помітити, ви повинні пам’ятати, що якщо ви зміните цільовий SDK на щось вище 13, то ваша активність буде відтворена за зміною орієнтації. Щоб уникнути цього, або додайте screenSize до android: configChanges (але в цьому випадку вам потрібно буде використовувати min sdk <13) або використовувати старий цільовий SDK (тоді ви можете зберегти android: configChanges)
Юрій Ашаєв

2
Це дає мені білий порожній екран на Nexus 7 (android 4.1). Будь-яка ідея, як це виправити?
Сахіль

Backbutton не зупиняє відео, а звук все ще звучить, будь-яка ідея, як це виправити?
CONvid19

Це те, що я шукав точно так само, як і рідний потік браузера. Дякую Тону Сурендру та Маленкію.
Абхілаш

33

Відповідь mdelolmo була неймовірно корисною, але, як він сказав, відео відтворюється лише один раз, і тоді ви не можете відкрити його знову.

Я трохи розібрався в цьому, і ось що я знайшов, якщо будь-який стомлений мандрівник WebView, як я, натрапляє на цю посаду в майбутньому.

Спочатку я переглянув документацію VideoView та MediaPlayer і зрозумів, як вони працюють. Я настійно рекомендую їх.

Потім я переглянув вихідний код, щоб побачити, як це робить браузер Android . Знайдіть сторінку та перегляньте, як вони обробляють onShowCustomView(). Вони зберігають посилання на CustomViewCallbackкористувальницький перегляд та на власний вигляд.

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

Виконавши ці дві речі, ви можете натиснути на те саме відео або будь-яке інше відео, і воно відкриється, як і раніше. Не потрібно перезавантажувати весь WebView.

Сподіваюся, що це допомагає.


Насправді я якось теж це вирішив, я просто не пам’ятав, щоб розміщувати рішення (сором мені). Так само, як і ви, мені довелося ознайомитися з кодом браузера Android, і, не надто додати, я використав слухач onCompletion, щоб замість цього зупинити програвач, і мені довелося встановити видимість пару разів, але я б придбав ваше рішення. З повагою!
mdelolmo

1
Пошук у коді Google вийшов на пенсію, я вважаю, що ця версія BrowserActivity.java (від Froyo) приблизно відповідає описаній тут: github.com/android/platform_packages_apps_browser/blob/…
michiakig

Зв'язаний код @ spacemanki не містить жодних згадок про VideoView у цілому репо. Я думаю, що BrowserActivity робить це зараз інакше. Я навіть повернувся до випуску Eclair. Неможливо знайти жодне використання.
mxcl

Проблема у мене з усім цим полягає в тому, що я повертаюся з frame.getFocusedChild (); є HTml5VideoView замість ViewView, і тому жодне з цього не працює для мене і не може переключитися на
повний

1
Нарешті для мене це було додати: @Override public void onStop () {super.onStop (); mWebView.destroy (); } для активності ... webview.destroy () було вирішальним
MacD

8

Насправді, здається, достатньо лише прикріпити запас WebChromeClient до перегляду клієнта, ала

mWebView.setWebChromeClient(new WebChromeClient());

і вам потрібно ввімкнути апаратне прискорення!

Принаймні, якщо вам не потрібно відтворювати повноекранне відео, немає необхідності витягати VideoView з веб-перегляду та заштовхувати його у режим перегляду діяльності. Він буде відтворюватися у виділеній прямої прямої частини відео елемента.

Будь-які ідеї, як перехопити кнопку розширення відео?


ви можете перехопити його за допомогою WebChromeClient та переважаючого onShowCustomView
Френка

Вкажіть, будь-яка версія Android. Це працює по-різному для різних версій.
Ethan_AI

7

Я знаю, що цій темі вже кілька місяців, але я знайшов рішення для відтворення відео всередині 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 відео - врешті-решт мій робочий код був дикою сумішшю різних кодових частин, які я знайшов у Інтернет та деякі речі, які мені довелося з’ясувати самостійно. Це справді був біль у *.


У ICS getFocusedChild () не повертає VideoView. Будь-яка ідея, як зробити цю роботу на ICS?
Паскаль

4

Цей підхід працює дуже добре до 2.3. І додавши hardwareaccelerated = правда, він працює навіть від 3,0 до ICS. Одна проблема, з якою я стикаюся в даний час, полягає в другому запуску програми для медіаплеєра, зазнає краху, тому що я не зупинив відтворення та випустив Media Player. Оскільки об’єкт VideoSurfaceView, який ми отримуємо у функції onShowCustomView від 3.0 ОС, характерний для браузера, а не об’єкта VideoView, як у, до 2.3 ОС. Як я можу отримати доступ до нього та зупинити відтворення та випустити ресурси?


3

AM аналогічно тому, що робить BrowerActivity . для FrameLayout.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 }

у методі onBackPress діяльності.


2

Я знаю, що це дуже давнє питання, але чи ви спробували hardwareAccelerated="true" явний прапор для вашої заявки чи діяльності?

З цим набором, здається, він працює без будь-яких змін WebChromeClient (чого я б очікував від DOM-Element.)


2
hardwareAcceleratedпочинається з Android 3.0
vbence

2

Я використовував 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);
}

2

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


Примітка: пішохідний перехід більше не підтримується .
slhck

1

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

Єдиною реальною альтернативою, здається, є створення нової веб-сторінки лише для WebView та відеозйомка старошкільним способом за допомогою посилання HREF, як зазначено у URL-адресі Codelark вище.

Іккі.


1

На соти вживають hardwareaccelerated=trueі, pluginstate.on_demandздається, працюють


1

У мене була подібна проблема. Я мав HTML-файли та відео у папці ресурсів свого додатка.

Тому відео були розміщені всередині АПК. Оскільки APK - це справді ZIP-файл, WebView не зміг прочитати відеофайли.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.