Frage

Ich bin zusammensetzen eines cheapo-app, die unter anderem die "frames" einige unserer websites...Ganz einfach mit dem WebViewClient.bis ich auf die video.

Das video ist fertig wie HTML5 Elemente, und diese Arbeit schön und gut auf Chrome, iPhones, und jetzt, da wir fest der Codierung Probleme, es funktioniert großartig auf Android in der nativen browser.

Jetzt der Haken: WebView mag es nicht.An alle.Ich kann Sie auf das Standbild, und nichts passiert.

Googlen fand ich diese die in der Nähe ist, aber zu sein scheint, basiert auf einem 'link' (wie in einem href -...) anstelle des video-Elements.(onDownloadListener nicht angezeigt zu bekommen aufgerufen video-Elemente...)

Ich sehe auch, Verweise auf übergeordnete onShowCustomView, aber das scheint nicht aufgerufen werden, auf video-Elemente...noch ist shouldOverrideUrlLoading..

Ich würde lieber nicht in "pull-xml vom server, formatieren Sie es in der app"..indem die Geschichte layout auf dem server kann ich die Inhalte ein bisschen besser ohne Leute zu zwingen, halten Sie eine app aktualisieren.Also, wenn ich davon überzeugen kann, WebView zu handhaben tags wie der browser, das wäre am besten.

Ich bin eindeutig etwas fehlt offensichtlich..aber ich habe keine Ahnung, was.

War es hilfreich?

Lösung

ich dieses Thema antworten nur, falls jemand es gelesen und auf das Ergebnis interessiert. Es ist möglich, ein Video-Element (Video html5-Tag) innerhalb einer WebView zu sehen, aber ich muss sagen, dass ich es für ein paar Tage zu tun hatte. Dies sind die Schritte, die ich hatte zu folgen, so weit:

-Find ein richtig kodierte Video

-Wenn die WebView initialisieren, stellen Sie den JavaScript, Plug-Ins das WebViewClient und die 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 onCompletion und die onError Ereignisse für das Video, um die Web-Ansicht zurück zu erhalten.

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 soll ich sagen, dass es nach wie vor ein wichtiges Thema ist. Ich kann es nur einmal spielen. Das zweite Mal, dass ich auf dem Video Dispatcher klicken (entweder das Plakat oder eine Play-Taste), es tut nichts.

Ich mag auch, dass das Video in dem WebView Rahmen zu spielen, anstatt das Media Player-Fenster zu öffnen, aber das ist für mich zweitrangig.

Ich hoffe, dass es jemand hilft, und ich danke auch jeden Kommentar oder Vorschlag.

Saludos, terrícolas.

Andere Tipps

Nach langer Forschung, bekam ich diese Sache arbeitet. 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>

Expecting Rest der Dinge kann man verstehen.

mdelolmo Antwort war unglaublich hilfsbereit, aber wie er sagte, das Video nur einmal abgespielt und dann können Sie es nicht wieder öffnen.

Ich sah dies in etwas, und hier ist was ich gefunden habe, falls alle müde WebView Reisende, wie ich zu diesem Beitrag stolpern in der Zukunft.

Zunächst einmal, schaute ich auf die Videoview und Mediaplayer 's Dokumentation und bekam ein besseres Gefühl für, wie diese Arbeit. I, wird dringend empfohlen.

Dann habe ich schaute auf die Quellcode zu sehen, wie der Android Browser es tut. Führen Sie eine Seite finden und gehen sehen, wie sie onShowCustomView() behandeln. Sie halten einen Verweis auf die CustomViewCallbackand auf die benutzerdefinierte Ansicht.

Mit all das, und mit mdelolmo Antwort im Sinne, wenn Sie mit dem Video fertig sind, alles, was Sie tun müssen, um zwei Dinge. Zuerst wird auf dem VideoView, dass Sie einen Verweis gespeichert, Anruf stopPlayback(), die die MediaPlayer freigeben werden, um später an anderer Stelle verwendet werden. Sie können es in der Videoview Code Quelle. Zweitens auf dem CustomViewCallback gespeichert Sie einen Verweis auf Anruf CustomViewCallback.onCustomViewHidden().

Nachdem diese beiden Dinge tun, können Sie auf dem gleichen Video klicken oder andere Video und es wird nach wie vor offen. Keine Notwendigkeit, die gesamte WebView neu zu starten.

Ich hoffe, das hilft.

Eigentlich, so scheint es ausreichend, lediglich eine Aktie WebChromeClient an den Client Ansicht anhängen, ala

mWebView.setWebChromeClient(new WebChromeClient());

, und Sie müssen die Hardwarebeschleunigung aktiviert haben!

Zumindest, wenn Sie nicht brauchen ein Vollbild-Video zu spielen, gibt es keine Notwendigkeit, die Videoview aus dem WebView zu ziehen und schieben Sie es in die Ansicht der Aktivität. Es wird in dem zugewiesenen rect Videoelement spielen.

Alle Ideen, wie zum Abfangen der Videotaste erweitern?

Ich weiß, dass dieses Thema mehrere Monate alt ist, aber ich fand eine Lösung für die Wiedergabe des Videos in der WebView ohne es zu tun Vollbild (aber immer noch in dem Media-Player ...). Bisher habe ich fand keinen Hinweis auf das im Internet so vielleicht ist dies auch für andere interessant ist. Ich bin immer noch auf einigen Fragen zu kämpfen (das heißt im rechten Bereich des Bildschirms den Media-Player platzieren, weiß nicht, warum ich tue es falsch, aber es ist ein relativ kleines Problem, das ich denke, ...).

In dem Custom ChromeClient LayoutParams angeben:

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

Meine onShowCustomView Methode sieht wie folgt 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 spiele um zu musste mit Video-Encoding und Sägen verschiedenen Arten von dem WebView mit html5 Video mit - am Ende meines Arbeits Code ein wilder Mix aus verschiedenen Code-Teilen war ich fand im Internet und einige Dinge, die ich von mir selbst herausfinden musste. Es war wirklich ein Schmerz in den a *.

Dieser Ansatz funktioniert sehr gut bis 2,3 Und durch hardwareaccelerated Addieren = true es funktioniert sogar von 3,0 bis ICS Ein Problem, das ich zur Zeit bin vor ist auf den zweiten Start von Media Player-Anwendung ist abgestürzt bekommen, weil ich nicht aufgehört haben, die Wiedergabe und Media Player freigegeben. Als VideoSurfaceView Objekt, das wir in onShowCustomView Funktion von OS 3.0 bekommen, sind spezifisch für Browser und nicht ein Objekt wie Videoview in, bis 2.3 OS Wie kann ich es und stopPlayback und Release Ressourcen?

von AM ist ähnlich zu dem, was die BrowerActivity tut. zum       FrameLayout.LayoutParams Layoutparameter = new FrameLayout.LayoutParams (768, 512);

Ich denke, wir können

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

statt.

Ein weiteres Problem, das ich getroffen ist, wenn das Video abgespielt wird, und Benutzer klickt auf die Zurück-Taste, das nächste Mal, Sie zu dieser Aktivität gehen (singleTop eins) und kann das Video nicht abspielen. dieses Problem zu beheben, rief ich die

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

in der onBackPressed Methode Aktivität.

Ich weiß, das ist eine sehr alte Frage, aber haben Sie versucht, die hardwareAccelerated="true" manifest Flagge für Ihre Anwendung oder Aktivität?

Mit diesem Set, wie es scheint zu funktionieren ohne WebChromeClient Modifikation (die ich von einem DOM-Elemente erwarten würde.)

Ich benutzte html5webview diese problem.Download zu lösen und sie in Ihrem Projekt setzen Sie dann kann wie dieser Code.

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, setzen android: configChanges = "Orientierung" Code in Ihre Aktivität zum Beispiel (AndroidManifest.xml)

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

und überschreibt die onConfigurationChanged Methode.

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

Diese Frage ist Jahre alt, aber vielleicht wird meine Antwort Leute wie ich helfen, die alte Android-Version unterstützen müssen. Ich habe versucht, viele verschiedene Ansätze, die auf einigen Android-Versionen gearbeitet, jedoch nicht auf alle. Die beste Lösung fand ich die Webview Fußgängerübergang zu verwenden, die für HTML5-Funktion Unterstützung und Werke auf Android optimiert ist 4.1 und höher. Es ist so einfach zu verwenden als Standard-Android WebView. Sie müssen nur die Bibliothek. Hier können Sie eine einfache Anleitung finden, wie man es verwenden: https://diego.org/2015/01/07/embedding-crosswalk-in-android-studio/

Nun, anscheinend ist dies einfach nicht möglich, ohne einen JNI registrieren Sie ein plugin, um die video-event.(Ich persönlich bin der Vermeidung von JNI ist, da ich wirklich nicht wollen, zu deal mit eine Sauerei, wenn die Atom-basierten android-tablets kommen in den nächsten Monaten verlieren die Portabilität von Java.)

Die einzige wirkliche alternative zu sein scheint, erstellen Sie eine neue web-Seite nur für WebView und video-old-school-Weg mit EINEM HREF-link, wie zitiert in der Codelark url oben.

Eklig.

Auf Waben Verwendung hardwareaccelerated=true und pluginstate.on_demand scheint Arbeit

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

Daher sind die Videos wurden innerhalb der APK entfernt. Da die APK ist wirklich eine ZIP-Datei, die WebView war nicht in der Lage, die Video-Dateien zu lesen.

Kopieren aller HTML- und Video-Dateien auf die SD-Card für mich gearbeitet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top