Ich setze eine billige App zusammen, die unter anderem einige unserer Websites "umrahmt" ... Ziemlich einfach mit der WebViewClient
. bis ich das Video getroffen habe.
Das Video wird als HTML5
Element erstellt, und diese funktionieren auf Chrome und iPhones einwandfrei, und jetzt, da wir die Codierungsprobleme behoben haben, funktioniert es Android
im nativen Browser hervorragend .
Jetzt die Reibung: WebView
mag es nicht. Überhaupt. Ich kann auf das Posterbild klicken und nichts passiert.
Beim Googeln habe ich festgestellt, dass dies nah ist, aber anscheinend auf einem 'Link' (wie in einem href ...) anstelle eines Videoelements basiert. (onDownloadListener wird anscheinend nicht für Videoelemente aufgerufen ...)
Ich sehe auch Verweise auf das Überschreiben von onShowCustomView, aber das scheint bei Videoelementen nicht aufgerufen zu werden ... und sollte auch nicht OverrideUrlLoading ..
Ich möchte 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 ein bisschen besser steuern, ohne die Leute zu zwingen, eine App weiter zu aktualisieren. Wenn ich WebView davon überzeugen kann, Tags wie den nativen Browser zu verarbeiten, ist dies am besten.
Mir fehlt eindeutig etwas Offensichtliches. Aber ich habe keine Ahnung, was.
VideoEnabledWebView
hier nachgeschaut. Stackoverflow.com/questions/15768837/…Antworten:
Ich beantworte dieses Thema nur für den Fall, dass jemand es liest und sich für das Ergebnis interessiert. Es ist möglich, ein Videoelement (Video-HTML5-Tag) in einer WebView anzuzeigen, aber ich muss sagen, dass ich mich einige Tage damit befassen musste. Dies sind die Schritte, denen ich bisher folgen musste:
-Finden Sie ein richtig codiertes Video
- Wenn Sie WebView initialisieren, legen Sie das JavaScript fest, fügen Sie den WebViewClient und den WebChromeClient ein.
- Behandeln Sie die onShowCustomView im WebChromeClient-Objekt.
- Behandeln Sie die Ereignisse onCompletion und onError für das Video, um zur Webansicht zurückzukehren.
Aber jetzt sollte ich sagen, dass es noch ein wichtiges Thema gibt. Ich kann es nur einmal spielen. Wenn ich zum zweiten Mal auf den Video-Dispatcher klicke (entweder auf das Poster oder auf eine Wiedergabetaste), geschieht nichts.
Ich möchte auch, dass das Video im WebView-Frame abgespielt wird, anstatt das Media Player-Fenster zu öffnen, aber dies ist 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.
quelle
WebChromeClient
die entsprechenden Methoden erweitern und überschreiben, die Sie benötigen. Wenn Sie darauf bestehen, kann ich den Rest der Klasse später hochladen, wenn ich nach Hause komme.Nach langer Recherche habe ich dieses Ding zum Laufen gebracht. Siehe folgenden Code:
Test.java
HTML% VIDEO.java
custom_screen.xml
video_loading_progress.xml
Farben.xml
Manifest.xml
Erwarten Sie den Rest der Dinge, die Sie verstehen können.
quelle
mdelolmos antwort war unglaublich hilfreich, aber wie er sagte, das video wird nur einmal abgespielt und dann kann man es nicht wieder ö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 sollten.
Zunächst einmal, schaute ich auf der Videoview und Mediaplayer ‚s Dokumentation und bekam ein besseres Gefühl für , wie diese Arbeit. Ich kann diese nur empfehlen.
Dann habe ich mir den Quellcode angesehen, um zu sehen, wie der Android-Browser das macht. Machen Sie eine Seite suchen und schauen Sie sich an, wie sie damit umgehen
onShowCustomView()
. Sie behalten einen Verweis auf dieCustomViewCallback
und auf die benutzerdefinierte Ansicht.In Anbetracht dessen und unter Berücksichtigung der Antwort von mdelolmo müssen Sie nach Abschluss des Videos nur zwei Dinge tun.
VideoView
Rufen Sie zunächst auf dem, auf den Sie einen Verweis gespeichert haben,stopPlayback()
denMediaPlayer
auf, der später für eine andere Verwendung freigegeben wird. Sie können es im VideoView- Quellcode sehen. Zweitens haben Sie auf derCustomViewCallback
Referenz einen Anruf gespeichertCustomViewCallback.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. Sie müssen nicht das gesamte WebView neu starten.
Hoffentlich hilft das.
quelle
Tatsächlich scheint es ausreichend zu sein, lediglich einen Standard-WebChromeClient an die Client-Ansicht anzuhängen, ala
und Sie müssen die Hardwarebeschleunigung aktiviert haben!
Wenn Sie kein Vollbildvideo abspielen müssen, müssen Sie die Videoansicht nicht aus der Webansicht ziehen und in die Ansicht der Aktivität verschieben. Es wird im zugewiesenen Rechteck des Videoelements abgespielt.
Irgendwelche Ideen, wie man die Schaltfläche zum Erweitern des Videos abfängt?
quelle
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 auszuführen (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 (z. B. Platzieren des Media Players im rechten Bereich des Bildschirms. Ich weiß nicht, warum ich es falsch mache, aber es ist ein relativ kleines Problem, denke ich ...).
Geben Sie im benutzerdefinierten ChromeClient LayoutParams an:
Meine onShowCustomView-Methode sieht folgendermaßen aus:
Also, ich hoffe ich könnte helfen ... Auch ich musste mit Video-Encoding herumspielen und sah verschiedene Arten der Verwendung von WebView mit HTML5-Video - am Ende war mein Arbeitscode eine wilde Mischung aus verschiedenen Code-Teilen, in denen ich gefunden habe das Internet und einige Dinge, die ich selbst herausfinden musste. Es war wirklich ein Schmerz im a *.
quelle
Dieser Ansatz funktioniert sehr gut bis 2.3. Und durch Hinzufügen von hardwareaccelerated = true funktioniert er sogar von 3.0 zu ICS. Ein Problem, mit dem ich derzeit konfrontiert bin, ist, dass beim zweiten Start der Media Player-Anwendung ein Absturz auftritt, da ich die Wiedergabe nicht gestoppt und den Media Player freigegeben habe. Da das VideoSurfaceView-Objekt, das wir in der onShowCustomView-Funktion ab dem Betriebssystem 3.0 erhalten, spezifisch für den Browser und nicht für ein VideoView-Objekt wie in 2.3 ist, wie kann ich darauf zugreifen und die Wiedergabe stoppen und Ressourcen freigeben?
quelle
AMs ähneln denen der BrowerActivity . für FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams (768, 512);
Ich denke wir können verwenden
stattdessen.
Ein weiteres Problem, auf das ich gestoßen bin, ist, wenn das Video abgespielt wird und der Benutzer beim nächsten Mal auf die Schaltfläche "Zurück" klickt. Sie gehen zu dieser Aktivität (singleTop one) und können das Video nicht abspielen. Um dies zu beheben, rief ich die
in der onBackPressed-Methode der Aktivität.
quelle
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 WebChromeClient-Modifikation zu funktionieren (was ich von einem DOM-Element erwarten würde).
quelle
hardwareAccelerated
startet von Android 3.0Ich 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 codieren.
Um das Video drehbar zu machen, fügen Sie beispielsweise den Code android: configChanges = "Orientierung" in Ihre Aktivität ein (Androidmanifest.xml).
und überschreiben Sie die onConfigurationChanged-Methode.
quelle
Diese Frage ist Jahre alt, aber vielleicht hilft meine Antwort Leuten wie mir, die die alte Android-Version unterstützen müssen. Ich habe viele verschiedene Ansätze ausprobiert, die bei einigen Android-Versionen funktionierten, jedoch nicht bei allen. Die beste Lösung, die ich gefunden habe, ist die Verwendung von Crosswalk Webview, das für die Unterstützung von HTML5-Funktionen optimiert ist und unter Android 4.1 und höher funktioniert. Es ist so einfach zu bedienen wie das Standard-Android-WebView. Sie müssen nur die Bibliothek einschließen. Hier finden Sie ein einfaches Tutorial zur Verwendung: https://diego.org/2015/01/07/embedding-crosswalk-in-android-studio/
quelle
Nun, anscheinend ist dies einfach nicht möglich, ohne ein JNI zu verwenden, um ein Plugin zu registrieren, um das Videoereignis zu erhalten. (Ich persönlich vermeide JNIs, da ich mich wirklich nicht mit einem Durcheinander befassen möchte, wenn Atom-basierte Android-Tablets in den nächsten Monaten herauskommen und die Portabilität von Java verlieren.)
Die einzige wirkliche Alternative scheint darin zu bestehen, eine neue Webseite nur für WebView zu erstellen und Videos auf die alte Art und Weise mit einem A HREF-Link zu erstellen, wie in der obigen Codelark-URL angegeben.
Eklig.
quelle
Auf Wabengebrauch
hardwareaccelerated=true
undpluginstate.on_demand
scheint zu funktionierenquelle
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 WebView die Videodateien nicht lesen.
Das Kopieren aller HTML- und Videodateien auf die SD-Karte hat bei mir funktioniert.
quelle