it-swarm.com.de

WebView und HTML5 <Video>

Ich setze eine Cheapo-App zusammen, die unter anderem einige unserer Websites "umrahmt" ... Ganz einfach mit der WebViewClient. bis ich auf das Video stoße.

Das Video wird als HTML5-Element erstellt, und diese funktionieren auf Chrome und iPhones gut und unkompliziert, und jetzt, da wir die Codierungsprobleme behoben haben, funktioniert es mit Android im nativen Browser hervorragend.

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

Googeln habe ich this gefunden, was zwar nahe liegt, aber anscheinend auf einem 'Link' (wie bei einem href ...) anstelle eines Videoelements basiert. (onDownloadListener scheint nicht für Videoelemente aufgerufen zu werden ...)

Ich sehe auch Verweise auf das Überschreiben von onShowCustomView, aber das wird anscheinend nicht für Videoelemente aufgerufen ... und es sollte auch nicht overrideUrlLoading .. 

Ich möchte lieber nicht in "xml vom Server ziehen, in der App neu formatieren". Durch das Beibehalten des Story-Layouts auf dem Server kann ich den Inhalt ein wenig besser steuern, ohne die Leute dazu zu zwingen, eine App zu aktualisieren. Wenn ich also WebView davon überzeugen kann, mit Tags wie dem nativen Browser zu arbeiten, wäre das am besten.

Ich vermisse eindeutig etwas offensichtliches .. aber ich habe keine Ahnung was.

121
brian moore

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

- Finden Sie ein ordnungsgemäß codiertes Video

-Wenn Sie das WebView initialisieren, setzen Sie das JavaScript, die Plugins den WebViewClient und den 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); 

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

-Handle 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, dass es immer noch ein wichtiges Thema gibt. Ich kann es nur einmal spielen. Das zweite Mal, wenn ich auf den Video-Dispatcher klicke (entweder das Poster oder eine Wiedergabeschaltfläche), macht er nichts.

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

Ich hoffe, es hilft jemandem, und ich würde mich auch für jeden Kommentar oder Vorschlag bedanken.

Saludos, Terrícolas.

92
mdelolmo

Nach langen Nachforschungen bekam ich dieses Ding zum Laufen. Siehe den 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>

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>

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

58
surendra

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

Ich habe mir das ein wenig angesehen und hier ist, was ich gefunden habe, falls müde WebView-Reisende wie ich in der Zukunft auf diesen Beitrag stoßen.

Zuerst habe ich mir die Dokumentation von VideoView und MediaPlayer angesehen und ein besseres Verständnis dafür bekommen, wie diese funktionieren. Ich empfehle diese dringend.

Dann habe ich mir den Quellcode angesehen, um zu sehen, wie der Android Browser dies tut. Suchen Sie eine Seite und schauen Sie sich an, wie sie mit onShowCustomView() umgehen. Sie enthalten einen Verweis auf CustomViewCallbackund auf die benutzerdefinierte Ansicht.

Bei all dem und angesichts der Antwort von mdelolmo, wenn Sie mit dem Video fertig sind, müssen Sie nur zwei Dinge tun. Rufen Sie zunächst VideoView, auf dem Sie einen Verweis gespeichert haben, stopPlayback() auf, der MediaPlayer freigibt, um später an anderer Stelle verwendet zu werden. Sie können es im Quellcode VideoView sehen. Zweitens haben Sie auf CustomViewCallback eine Referenz zum Aufruf von CustomViewCallback.onCustomViewHidden() gespeichert.

Nachdem Sie diese beiden Schritte ausgeführt haben, können Sie auf dasselbe Video oder ein anderes Video klicken und es wird wie zuvor geöffnet. Kein Neustart des gesamten WebView.

Hoffentlich hilft das.

33
cottonBallPaws

Tatsächlich scheint es ausreichend zu sein, nur einen börsennotierten WebChromeClient an die Clientansicht anzufügen

mWebView.setWebChromeClient(new WebChromeClient());

und Sie müssen die Hardwarebeschleunigung aktiviert haben!

Wenn Sie kein Video im Vollbildmodus abspielen müssen, müssen Sie zumindest nicht das VideoView aus dem WebView ziehen und in die Aktivitätsansicht verschieben. Es wird im zugewiesenen rect des Videoelements abgespielt. 

Irgendwelche Ideen, wie man den Expand-Video-Button abfängt? 

8
Russ Schnapp

Ich weiß, dass dieser Thread mehrere Monate alt ist, aber ich habe eine Lösung gefunden, um das Video in WebView abzuspielen, ohne es im Vollbildmodus zu machen (aber immer noch im Media Player ...). Bisher habe ich im Internet keinen Hinweis darauf gefunden, daher ist dies möglicherweise auch für andere interessant ... Ich habe immer noch Probleme mit einigen Problemen (dh, den Media-Player im rechten Bildschirmbereich zu platzieren, don.) Ich weiß nicht, warum ich es falsch mache, aber ich denke, es ist ein relativ kleines Thema ...).

Geben Sie im Custom ChromeClient LayoutParams an:

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

Meine onShowCustomView-Methode sieht folgendermaßen 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();
         }
     }
 }

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 Arbeitscode eine wilde Mischung aus verschiedenen Codeteilen, die ich gefunden hatte das Internet und einige Dinge, die ich selbst herausfinden musste. Es war wirklich ein Schmerz im a *.

6
A-M

Dieser Ansatz funktioniert sehr gut bis 2.3 .__ und durch das Hinzufügen von hardwareaccelerated = true funktioniert es sogar von 3.0 bis ICSEin Problem, dem ich derzeit gegenüberstehe, ist beim zweiten Start der Media-Player-Anwendung, die abgestürzt ist, weil ich die Wiedergabe nicht gestoppt habe freigegebener Mediaplayer . Da das VideoSurfaceView-Objekt, das wir in der OnShowCustomView-Funktion von 3.0 OS erhalten, ein Browser-spezifisches Objekt ist und kein VideoView-Objekt wie in 2.3 bis 2.3 OS

4
Nova

A-M's ist ähnlich wie die BrowerActivity . zum 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 anderes Problem, das ich traf, ist, wenn das Video abgespielt wird und der Benutzer auf die Zurück-Schaltfläche klickt. Wenn Sie das nächste Mal zu dieser Aktivität wechseln (singleTop-Aktivität), kann das Video nicht abgespielt werden. um das zu beheben, rief ich an 

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

in der onBackPressed-Methode der Aktivität.

3
yincan

Diese Frage ist Jahre alt, aber vielleicht hilft meine Antwort Leuten wie mir, die alte Android-Versionen unterstützen müssen. Ich habe viele verschiedene Ansätze ausprobiert, die auf einigen Android-Versionen funktionierten, jedoch nicht auf allen. Die beste Lösung, die ich gefunden habe, ist die Verwendung von Crosswalk Webview , die für die Unterstützung von HTML5-Funktionen optimiert ist und unter Android 4.1 und höher funktioniert. Es ist so einfach zu verwenden wie das Standard-Android-WebView. Sie müssen nur die Bibliothek hinzufügen. Hier finden Sie ein einfaches Tutorial zur Verwendung: https://diego.org/2015/01/07/embedding-crosswalk-in-Android-studio/

2
Apfelsaft

Ich weiß, dass dies eine sehr alte Frage ist, aber haben Sie das hardwareAccelerated="true"-Manifest-Flag für Ihre Anwendung oder Aktivität ausprobiert?

Mit diesem Set scheint es ohne jegliche WebChromeClient-Änderung zu funktionieren (was ich von einem DOM-Element erwarten würde).

2
Nappy

Ich habe html5webview verwendet, um dieses Problem zu lösen. Laden Sie es herunter und fügen Sie es in Ihr Projekt ein. Dann können Sie einfach so Code schreiben.

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

Um das Video drehbar zu machen, fügen Sie Android: configChanges = "Orientierungscode" in Ihren Activity .__ ein, zum Beispiel (Androidmanifest.xml).

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

und überschreiben Sie die onConfigurationChanged-Methode.

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

Bei der Verwendung von Honeycomb scheinen hardwareaccelerated=true und pluginstate.on_demand zu funktionieren

1
user953501

Ich hatte ein ähnliches Problem. Ich hatte HTML-Dateien und Videos im Assets-Ordner meiner App.

Daher befanden sich die Videos innerhalb der APK. Da es sich bei der APK tatsächlich um eine Zip-Datei handelt, konnte der WebView die Videodateien nicht lesen.

Das Kopieren aller HTML- und Videodateien auf die SD-Karte hat für mich funktioniert.

1
RhodanV5500

Nun, scheinbar ist dies einfach nicht möglich, ohne ein JNI zu verwenden, um ein Plugin zu registrieren, um das Videoereignis abzurufen. (Ich persönlich vermeide JNIs, da ich mich wirklich nicht mit Chaos beschäftigen möchte, wenn Atom-basierte Android-Tablets in den nächsten Monaten auf den Markt kommen und die Portabilität von Java verloren geht.)

Die einzige wirkliche Alternative scheint zu sein, eine neue Webseite nur für WebView zu erstellen und Videos auf die alte Art und Weise mit einem A HREF-Link zu machen, wie in der Codelark-URL oben angegeben.

Eklig.

0
brian moore