WebView und HTML5

Lesezeit: 17 Minuten

WebView und HTML5
Brian Moore

Ich bastle gerade eine Cheapo-App zusammen, die unter anderem einige unserer Websites “rahmt”… Ziemlich einfach mit dem WebViewClient. bis ich auf das Video klickte.

Das Video ist so gemacht HTML5 Elemente, und diese funktionieren gut und gut auf Chrome, iPhones, und jetzt, wo wir die Codierungsprobleme behoben haben, funktioniert es großartig Android im nativen Browser.

Jetzt der Haken: WebView mag es nicht. Überhaupt. Ich kann auf das Posterbild klicken, und nichts passiert.

Googeln, fand ich Das das ist nah dran, scheint aber auf einem ‘link’ (wie in einem href …) statt auf einem Videoelement zu basieren. (onDownloadListener scheint bei Videoelementen nicht aufgerufen zu werden…)

Ich sehe auch Verweise auf das Überschreiben von onShowCustomView, aber das scheint nicht für Videoelemente aufgerufen zu werden … und sollte OverrideUrlLoading auch nicht.

Ich würde lieber nicht auf “Xml vom Server ziehen, in der App neu formatieren” eingehen. Indem ich das Story-Layout auf dem Server behalte, kann ich den Inhalt etwas besser kontrollieren, ohne die Leute zu zwingen, eine App ständig zu aktualisieren. Wenn ich also WebView davon überzeugen kann, Tags wie der native Browser zu handhaben, wäre das am besten.

Mir fehlt eindeutig etwas Offensichtliches … aber ich habe keine Ahnung, was.

  • Bitte sehen Sie: code.google.com/p/android/issues/detail?id=22254

    – Vorstand

    25. November 2011 um 12:28 Uhr

  • In diesem Sinne suche ich einen HTML5-Player für meine Website. Was soll ich verwenden?

    – Wolfsrudel’08

    22. Oktober 2012 um 8:24 Uhr

  • Meine Antwort hier: stackoverflow.com/a/16179544/423171

    – cprcrack

    15. Juli 2013 um 14:20 Uhr

  • Nichts hat funktioniert, also habe ich nachgeschaut VideoEnabledWebView hier stackoverflow.com/questions/15768837/…

    – EpicPandaForce

    26. November 2014 um 13:29 Uhr

WebView und HTML5
mdelolmo

Ich beantworte dieses Thema nur für den Fall, dass es jemand gelesen hat und an dem Ergebnis interessiert ist. Es ist möglich, ein Videoelement (Video-HTML5-Tag) in einem WebView anzuzeigen, aber ich muss sagen, ich musste mich einige Tage damit befassen. Dies sind die Schritte, die ich bisher befolgen musste:

-Finden Sie ein richtig codiertes Video

– Legen Sie beim Initialisieren des WebViews das JavaScript, die Plug-ins den WebViewClient und den WebChromeClient fest.

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

– Behandeln Sie die onShowCustomView im WebChromeClient-Objekt.

@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();
        }
    }
}

– Behandeln Sie die Ereignisse onCompletion und onError für das Video, um zur Webansicht zurückzukehren.

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();
}

Aber jetzt sollte ich sagen, es gibt noch ein wichtiges Thema. Ich kann es nur einmal spielen. Wenn ich das zweite Mal auf den Video-Dispatcher klicke (entweder das Poster oder eine Wiedergabeschaltfläche), passiert nichts.

Ich möchte auch, dass das Video im WebView-Frame abgespielt wird, anstatt das Media Player-Fenster zu öffnen, aber das ist für mich ein zweitrangiges Problem.

Ich hoffe, es hilft jemandem, und ich wäre auch für jeden Kommentar oder Vorschlag dankbar.

Saludos, Terricolas.

  • Ich bekomme kein Ergebnis, mein Bildschirm ist schwarz. Ich möchte wissen, ob dies thead braucht. Mein Code ist zu lang, um ihn hier einzufügen. Können Sie mir eine Kontaktmöglichkeit geben oder ein anderes Thema eröffnen?

    – pengwang

    8. Oktober 2010 um 2:59 Uhr


  • Bist du dir absolut sicher, dass es sich nicht um ein Codierungsproblem handelt? Versuchen Sie es mit der URL, die ich gepostet habe. Natürlich muss es mit dem nativen Browser funktionieren

    – mdelolmo

    8. Oktober 2010 um 14:49 Uhr

  • was ist “ein”? wie diese Aktivität wäre das?

    – Collin Preis

    8. März 2012 um 3:21 Uhr

  • @Collin Price a ist eine Instanz der Aktivität, die die Webansicht hostet. @desgraci, ich kann es zur Verfügung stellen, aber darüber hinaus gibt es nicht viel. Lassen Sie eine Klasse erweitern WebChromeClient und überschreiben Sie die entsprechenden Methoden, die Sie benötigen. Wenn Sie darauf bestehen, kann ich den Rest der Klasse später hochladen, wenn ich nach Hause komme.

    – mdelolmo

    11. Juli 2012 um 14:28 Uhr

  • Funktioniert nicht auf ICS, da getFocusedChild() kein VideoView ist, sondern ein HTML5VFullScreen$SurfaceVideoView. Irgendeine Idee, wie man auf ICS vorgeht? (siehe stackoverflow.com/questions/13540654/…

    – Paskal

    16. April 2013 um 18:09 Uhr

1646247134 779 WebView und HTML5
Surendra

Nach langer Recherche habe ich dieses Ding zum Laufen gebracht. Siehe folgenden Code:

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>

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

Erwarten Sie den Rest der Dinge, die Sie verstehen können.

  • Dies sollte die akzeptierte Antwort sein. Surendra und Malenkiy, ihr beide habt meinen Verstand gerettet. Hat bei mir super funktioniert.

    – Georg Bäcker

    28. Dezember 2012 um 23:26 Uhr


  • Ich stimme Georg zu. Genau so funktioniert der native Android-Browser mit VideoView. Scheint derselbe Code wie hier zu sein code.google.com/p/html5webview. Es funktioniert hervorragend für alle Android-Versionen (ich habe es auf Android 2.2 und höher getestet). Nur eine Sache, die ich bemerken wollte, Sie sollten bedenken, dass, wenn Sie das Ziel-SDK auf etwas über 13 ändern, Ihre Aktivität beim Ändern der Ausrichtung neu erstellt wird. Um dies zu vermeiden, hängen Sie entweder screenSize an android:configChanges an (aber in diesem Fall müssen Sie min sdk < 13 verwenden) oder verwenden Sie das alte Ziel-SDK (dann können Sie android:configChanges beibehalten).

    – Jurij

    16. Januar 2013 um 18:30 Uhr

  • Dies gibt mir einen weißen leeren Bildschirm auf Nexus 7 (Android 4.1). Irgendeine Idee, wie man das beheben kann?

    – Sahil

    26. Juli 2013 um 9:15 Uhr

  • Die Zurück-Taste stoppt das Video nicht und der Ton ist immer noch hörbar. Haben Sie eine Idee, wie Sie das beheben können?

    – Pedro Lobito

    7. April 2014 um 4:12 Uhr

  • Das ist genau das, wonach ich gesucht habe, genau wie der native Browser-Flow. Danke an Ton Surendra und Malenkiy.

    – Abhilash

    19. Juli 2017 um 13:33 Uhr

Die Antwort von mdelolmo war unglaublich hilfreich, aber wie er sagte, wird das Video nur einmal abgespielt und Sie können es dann nicht erneut öffnen.

Ich habe mich ein wenig damit befasst und hier ist, was ich gefunden habe, falls müde WebView-Reisende wie ich in Zukunft über diesen Beitrag stolpern.

Als erstes habe ich mir die angeschaut VideoView und Media Player‘s Dokumentation und bekam ein besseres Gefühl dafür, wie diese funktionieren. Ich empfehle die dringend.

Dann habe ich mir die angeschaut Quellcode zu sehen, wie der Android-Browser macht es. Machen Sie eine Seitensuche und schauen Sie sich an, wie sie damit umgehen onShowCustomView(). Sie halten einen Verweis auf die CustomViewCallbackund zur benutzerdefinierten Ansicht.

Mit all dem und mit mdelolmos Antwort im Hinterkopf, wenn Sie mit dem Video fertig sind, müssen Sie nur noch zwei Dinge tun. Zunächst auf der VideoView auf die Sie einen Verweis gespeichert haben, rufen Sie an stopPlayback() das wird die freigeben MediaPlayer später woanders zu verwenden. Sie können es in der sehen VideoView Quellcode. Zweitens auf der CustomViewCallback Sie haben einen Anrufhinweis gespeichert CustomViewCallback.onCustomViewHidden().

Nachdem Sie diese beiden Dinge getan haben, können Sie auf dasselbe Video oder ein anderes Video klicken und es wird wie zuvor geöffnet. Es ist nicht erforderlich, das gesamte WebView neu zu starten.

Ich hoffe, das hilft.

  • Eigentlich habe ich es auch irgendwie gelöst, ich habe nur nicht daran gedacht, die Lösung zu posten (Schande über mich). Genau wie Sie musste ich mir den Code des Android-Browsers ansehen, und nun, nicht viel hinzuzufügen, ich habe stattdessen den onCompletion-Listener verwendet, um den Player zu stoppen, und musste die Sichtbarkeit ein paar Mal einstellen, aber ich würde Ihre Lösung kaufen. Grüße!

    – mdelolmo

    10. Januar 2011 um 7:57 Uhr

  • Google Code Search wurde eingestellt, ich denke, diese Version von BrowserActivity.java (von Froyo) entspricht in etwa der hier beschriebenen: github.com/android/platform_packages_apps_browser/blob/…

    – michiakig

    24. Januar 2012 um 19:12 Uhr

  • Der verknüpfte Code von @spacemanki enthält keine Erwähnungen von VideoView im gesamten Repo. Ich denke, BrowserActivity macht es jetzt anders. Ich ging sogar zurück zur Eclair-Veröffentlichung. Kann keine Verwendung finden.

    – mxkl

    22. März 2012 um 18:56 Uhr

  • Das Problem, das ich mit all dem habe, ist, dass ich von frame.getFocusedChild(); ist ein HTml5VideoView anstelle eines ViewView und daher funktioniert nichts davon bei mir und ich kann nicht auf Vollbild umschalten 🙁 Ich bin auf Android 4.1.2.

    – Gonan

    18. Januar 2013 um 12:59 Uhr

  • Was es schließlich für mich getan hat, war das Hinzufügen: @Override public void onStop() { super.onStop(); mWebView.destroy(); } zur Aktivität … die webview.destroy() war entscheidend

    – MacD

    4. April 2013 um 12:53 Uhr


1646247135 453 WebView und HTML5
BIN

Ich weiß, dass dieser Thread mehrere Monate alt ist, aber ich habe eine Lösung gefunden, um das Video in der WebView abzuspielen, ohne es im Vollbildmodus zu machen (aber immer noch im Mediaplayer …). Im Internet habe ich dazu bisher keinen Hinweis gefunden, vielleicht ist das ja auch für andere interessant. Ich kämpfe immer noch mit einigen Problemen (z. B. Platzieren des Mediaplayers im richtigen Bereich des Bildschirms, ich weiß nicht, warum ich es falsch mache, aber es ist ein relativ kleines Problem, denke ich …).

Geben Sie im benutzerdefinierten Chrome-Client LayoutParams an:

// 768x512 is the size of my video
FrameLayout.LayoutParams LayoutParameters = 
                                     new FrameLayout.LayoutParams (768, 512); 

Meine onShowCustomView-Methode sieht so aus:

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();
         }
     }
 }

Also, ich hoffe, ich konnte helfen … Ich musste auch mit Video-Encoding herumspielen und sah verschiedene Arten der Verwendung des WebView mit HTML5-Video – am Ende war mein funktionierender Code eine wilde Mischung aus verschiedenen Code-Teilen, die ich gefunden habe das Internet und einige Dinge musste ich selbst herausfinden. Es war wirklich ein Schmerz in der a*.

1646247135 504 WebView und HTML5
Russ Schnaps

Eigentlich scheint es ausreichend zu sein, einfach einen Standard-WebChromeClient an die Client-Ansicht anzuhängen, ala

mWebView.setWebChromeClient(new WebChromeClient());

und Sie müssen die Hardwarebeschleunigung aktiviert haben!

Wenn Sie kein Vollbildvideo abspielen müssen, müssen Sie die VideoView zumindest nicht aus der WebView ziehen und in die Ansicht der Aktivität verschieben. Es wird im zugewiesenen Rect des Videoelements abgespielt.

Irgendwelche Ideen, wie man die Schaltfläche zum Erweitern des Videos abfängt?

  • Sie können es mit WebChromeClient abfangen und onShowCustomView überschreiben

    – Frank

    17. Dezember 2013 um 11:05 Uhr

  • Bitte geben Sie an, welche Version von Android. Dies funktioniert für verschiedene Versionen unterschiedlich.

    – Ethan_AI

    13. November 2014 um 18:09 Uhr

1646247136 892 WebView und HTML5
Nova

Dieser Ansatz funktioniert sehr gut bis 2.3 und durch Hinzufügen von hardwareaccelerated=true funktioniert es sogar von 3.0 bis ICS. Ein Problem, mit dem ich derzeit konfrontiert bin, ist, dass beim zweiten Start der Media Player-Anwendung abgestürzt wird, weil ich die Wiedergabe nicht gestoppt und Media Player freigegeben habe. Als VideoSurfaceView-Objekt, das wir in der onShowCustomView-Funktion von 3.0 OS erhalten, sind sie browserspezifisch und kein VideoView-Objekt wie in 2.3 OS. Wie kann ich darauf zugreifen und die Wiedergabe stoppen und Ressourcen freigeben?

  • Sie können es mit WebChromeClient abfangen und onShowCustomView überschreiben

    – Frank

    17. Dezember 2013 um 11:05 Uhr

  • Bitte geben Sie an, welche Version von Android. Dies funktioniert für verschiedene Versionen unterschiedlich.

    – Ethan_AI

    13. November 2014 um 18:09 Uhr

WebView und HTML5
Yincan

AM ist ähnlich wie das, was die Browseraktivität tut. für FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams (768, 512);

Ich denke, wir können verwenden

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

stattdessen.

Ein weiteres Problem, auf das ich gestoßen bin, ist, wenn das Video abgespielt wird und der Benutzer auf die Schaltfläche „Zurück“ klickt, gehen Sie das nächste Mal zu dieser Aktivität (singleTop one) und können das Video nicht abspielen. Um dies zu beheben, rief ich die an

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

in der onBackPressed-Methode der Aktivität.

915080cookie-checkWebView und HTML5

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy