Nun, ich habe bereits einige Tage gesucht, wie man HTML5-Videos im Vollbildmodus auf Android WebView anzeigt.
Ich konnte HTML5-Videos in meiner Webansicht abspielen. Bei der Anzeige von Videos im Vollbildmodus treten Probleme auf.
Wie ich herausgefunden habe, hat Android zwei Möglichkeiten, mit dem <video> -Tag umzugehen:
In Android-Versionen <= 2.3.3 wird die onShowCustomView-Methode ausgelöst, und ich kann die VideoView-Instanz verwenden und Listener einstellen, wenn das Video fertig ist, Controller usw. einstellen. Soweit so gut.
Auf ICS (und wahrscheinlich 3.0 und höher) sieht es so aus, als würde das <Video> anders behandelt. Wenn das HTML5-Video abgespielt wird, wird onShowCustomView im normalen Modus nicht aufgerufen. Es sieht so aus, als ob sich in WebView ein internes Unternehmen befindet, das das Video wiedergibt, und alle im <video> -Tag definierten Steuerelemente werden angezeigt - I. kann in keiner Weise darauf zugreifen. Wenn das Video im normalen Modus abgespielt wird, ist dies in Ordnung, da die Steuerelemente vorhanden sind und funktionieren.
Das führte mich zu dem großen Problem: Wenn das Video im Vollbildmodus angezeigt wird, wird onShowCustomView aufgerufen - auf ICS ist der Parameter "view" jedoch keine Instanz von VideoView.
Ich konnte herausfinden, dass es sich bei der Instanz um VideoSurfaceView handelt, eine private innere Klasse der HTML5VideoFullScreen-Klasse. Der einzige Weg, wie wir auf diese innere Klasse zugreifen können, ist die Reflexion.
Nachdem ich mir GrepCode für diese Klasse angesehen hatte, stellte ich fest, dass HTML5VideoFullScreen $ VideoSurfaceView im Gegensatz zu VideoView keine MediaPlayer-Instanz enthält, mit der ich seine Ereignisse abhören oder auf seine Steuerelemente zugreifen kann. Das einzige, was ich tun kann, ist, dieses VideoSurfaceView so zu nehmen, wie es ist, und es in ein Vollbild-Layout einzufügen, ohne es zu steuern.
Fazit - Wenn ich Videos im Vollbildmodus anzeige, weiß ich nicht, wann das Video endet, seine Steuerelemente werden nicht angezeigt - das ist ziemlich traurig. Ich kann den Auslöser zum Schließen des Vollbilds nicht bekommen.
Ich habe einige erfolglose Problemumgehungen versucht:
Reflexion: Ich habe versucht, die HTML5VideoFullScreen-Instanz, die ein MediaPlayer-Mitglied enthält, über die VideoSurfaceView der inneren Klasse zu erreichen. Ich habe es nicht geschafft, ich bin mir nicht sicher, ob dies möglich ist (ViewSurfaceView enthält nicht die Instanz seines Besitzers).
Registrieren Sie sich für die Videoereignisse über Javascript (z. B. onended) und erledigen Sie das, was ich in JAVA benötige, über JavascriptInterface: Ich habe festgestellt, dass diese Lösung nicht zuverlässig ist, da dabei ein anderes Problem aufgetreten ist: Das <video> -Tag kann verschachtelt werden in einem (n . Die iframe-Quelle gehört nicht mir und ich kann ihren Inhalt nicht abrufen (getElementById oder getElementsByTagName [i] sind Nullen). Dies bedeutet, dass ich das <video> -Element im iframe nicht erreichen kann.
Ich bin immer noch auf der Suche nach einer Lösung, über dieses Problem ist sehr wenig geschrieben. Hat es jemand geschafft, es zu lösen? Hilfe wäre sehr dankbar!
VideoView- Klasse: Hier (hat MediaPlayer)
HTML5VideoFullScreen $ VideoSurfaceView- Klasse: Hier (ohne MediaPlayer)
Antworten:
Edit 2014/10: Auf vielfachen Wunsch pflege ich dies und verschiebe es auf GitHub. Bitte überprüfen Sie cprcrack / VideoEnabledWebView für die letzte Version. Bewahrt diese Antwort nur als Referenz auf.
Bearbeiten 2014/01: Verbesserte Beispielnutzung um die Ansichten Nicht-VideoLayout, VideoLayout und VideoLoading für Benutzer, die mehr Beispielcode zum besseren Verständnis anfordern.
Edit 2013/12: Einige Fehlerbehebungen im Zusammenhang mit der Kompatibilität von Sony Xperia-Geräten, die jedoch tatsächlich alle Geräte betrafen.
Edit 2013/11: Nach der Veröffentlichung von Android 4.4 KitKat (API Level 19) mit seiner neuen Chromium-Webansicht musste ich wieder hart arbeiten. Es wurden mehrere Verbesserungen vorgenommen. Sie sollten auf diese neue Version aktualisieren. Ich veröffentliche diese Quelle unter WTFPL .
Edit 2013/04: Nach 1 Woche harter Arbeit habe ich endlich alles erreicht, was ich brauchte. Ich denke, diese zwei generischen Klassen, die ich erstellt habe, können alle Ihre Probleme lösen.
VideoEnabledWebChromeClient
kann alleine verwendet werden, wenn Sie die hinzugefügte Funktionalität nicht benötigenVideoEnabledWebView
.VideoEnabledWebView
Muss sich aber immer auf a verlassenVideoEnabledWebChromeClient
. Bitte lesen Sie alle Kommentare der beiden Klassen sorgfältig durch.VideoEnabledWebChromeClient-Klasse
VideoEnabledWebView-Klasse
Anwendungsbeispiel:
Haupt Layout activity_main.xml , in dem wir eine VideoEnabledWebView und andere gebrauchte Ansichten setzen:
Die Aktivität ist onCreate () , in der wir sie initialisieren:
Und vergessen Sie nicht, onBackPressed () aufzurufen :
quelle
Getestet auf Android 9.0 Version
Keine der Antworten hat bei mir funktioniert. Dies ist das Letzte, was funktioniert hat
In AndroidManifest.xml
Quelle Monster Techno
quelle
Bearbeiten: Bitte sehen Sie meine andere Antwort , da Sie diese jetzt wahrscheinlich nicht brauchen.
Wie Sie sagten, wird in API-Levels 11+ ein HTML5VideoFullScreen $ VideoSurfaceView übergeben. Aber ich glaube nicht, dass Sie Recht haben, wenn Sie sagen, dass "es keinen MediaPlayer gibt".
Auf diese Weise erreichen Sie die MediaPlayer-Instanz über die HTML5VideoFullScreen $ VideoSurfaceView-Instanz mithilfe von Reflection :
Jetzt können Sie den onCompletion-Listener der MediaPlayer-Instanz folgendermaßen einstellen:
Der Code schlägt nicht fehl, aber ich bin nicht ganz sicher, ob dieser onCompletion-Listener wirklich aufgerufen wird oder ob er für Ihre Situation nützlich sein könnte. Aber nur für den Fall, dass jemand es versuchen möchte.
quelle
Vielen Dank für diese Klasse, Cristian.
Ich habe eine kleine Änderung daran vorgenommen, damit die benutzerdefinierte Ladeansicht optional ist, wie folgt:
Ich habe auch einen neuen Konstruktor hinzugefügt, der nur zwei Parameter akzeptiert. Wie auch immer, nur eine kleine Vereinfachung, wenn Sie die Ladeansicht nicht benötigen. Nochmals vielen Dank für die Bereitstellung.
quelle
Einfach einstellen
mWebView.setWebChromeClient(new WebChromeClient());
und Videowiedergabe wie gewohnt benötigt keine benutzerdefinierte Ansicht.
quelle
Das ist toll. Wenn Sie jedoch möchten, dass Ihre Website-Links in der App selbst geöffnet werden, fügen Sie diesen Code in Ihre ExampleActivity.java ein:
quelle
Die Antwort von Cprcrack funktioniert sehr gut für API-Level 19 und darunter. Mit nur einer kleinen Ergänzung zu cprcrack
onShowCustomView
funktioniert es auf API-Level 21+Sie müssen auch die Änderungen in widerspiegeln
onHideCustomView
quelle
Es scheint, dass in lollipop und höher (oder vielleicht nur in einer anderen WebView-Version) diese aufrufende
cprcrack's
onHideCustomView()
Methode nicht funktioniert. Es funktioniert, wenn es über die Schaltfläche "Vollbild beenden" aufgerufen wird. Wenn Sie jedoch die Methode speziell aufrufen, wird nur der Vollbildmodus beendet, das FeldwebView
bleibt jedoch leer. Eine Möglichkeit, dies zu umgehen, besteht darin, diese Codezeilen einfach hinzuzufügen zuonHideCustomView()
:Dadurch wird das WebView darüber informiert, dass der Vollbildmodus beendet wurde.
quelle