Eh bien, j'ai cherché pendant plusieurs jours déjà, comment afficher une vidéo HTML5 en mode plein écran sur Android WebView.
J'ai réussi à lire des vidéos HTML5 sur mon webview. Les problèmes surviennent lors de l'affichage de la vidéo en mode plein écran.
Comme je l'ai compris, Android a deux façons de gérer la balise <vidéo> :
-
Sur les versions d'Android <= 2.3.3 la méthode onShowCustomView est déclenchée, et je peux avoir l'instance VideoView, et définir des écouteurs lorsque la vidéo se termine, définir des contrôleurs, etc. Jusqu'à présent, tout va bien.
-
Sur ICS (et probablement 3.0 et plus) il semble que le <vidéo> soit traité de manière différente. Lorsque la vidéo HTML5 est lue, le onShowCustomView n'est pas appelé en mode normal - il semble qu'il y ait une activité interne à l'intérieur du WebView qui lit la vidéo, et tous les contrôles qui sont définis dans la balise < video > sont affichés - je ne peux y accéder d'aucune façon. En fait, si la vidéo est lue en mode normal, c'est OK parce que les contrôles sont là et fonctionnent.
Cela m'a conduit au gros problème : lors de l'affichage de la vidéo en mode plein écran, le onShowCustomView est appelé - mais sur ICS, le paramètre "view" n'est pas une instance de VideoView.
J'ai réussi à découvrir que l'instance est de VideoSurfaceView, une classe interne privée de la classe HTML5VideoFullScreen. La seule façon d'accéder à cette classe interne est par réflexion.
Après avoir regardé le GrepCode de cette classe, j'ai appris que, contrairement à VideoView, le HTML5VideoFullScreen$VideoSurfaceView ne contient pas d'instance MediaPlayer dont je pourrais écouter les événements ou accéder aux contrôles. La seule chose que je puisse faire est de prendre ce VideoSurfaceView tel quel et de le placer dans un affichage plein écran sans le contrôler.
En résumé - Lorsque j'affiche une vidéo en plein écran, je ne sais pas quand la vidéo se termine, ses contrôles ne sont pas affichés - c'est assez triste. Je n'arrive pas à obtenir le déclencheur pour fermer le plein écran.
J'ai essayé plusieurs solutions de contournement sans succès :
-
Réflexion : J'ai essayé d'atteindre l'instance HTML5VideoFullScreen, qui contient un membre MediaPlayer, à partir de la classe interne VideoSurfaceView. Je n'ai pas réussi à l'obtenir, je ne suis pas sûr que cela soit possible (ViewSurfaceView ne détient pas l'instance de son propriétaire).
-
S'enregistrer pour les événements vidéo via Javascript (onended, par exemple), et gérer ce dont j'ai besoin en JAVA via JavascriptInterface : J'ai constaté que cette solution n'est pas fiable car en faisant cela, j'ai rencontré un autre problème : la balise < video > peut être imbriquée dans une . La source de l'iframe n'est pas la mienne et je ne peux pas obtenir son contenu (getElementById ou getElementsByTagName[i] sont nuls) - ce qui signifie que je ne peux pas atteindre l'élément < video > à l'intérieur de l'iframe.
Je suis toujours à la recherche d'une solution, il y a très peu d'écrits sur ce sujet. Quelqu'un a-t-il réussi à le résoudre ? Une aide serait très appréciée !
VidéoView classe : Aquí (a MediaPlayer)
HTML5VideoFullScreen$VideoSurfaceView classe : Aquí (n'a pas MediaPlayer)
0 votes
Même problème que vous, et je suis arrivé aux mêmes conclusions. J'ai travaillé sur ce problème pendant environ 20 heures, mais je n'abandonnerai pas avant au moins 20 heures supplémentaires (de vraies heures de travail, je veux dire). Je vous dirai si je trouve la solution. En attendant, comme cette question a été posée il y a 20 jours, essayez-vous toujours de la résoudre ou avez-vous appliqué une autre solution de contournement ?
0 votes
À propos, un rapide coup d'œil au code source de HTML5VideoFullScreen a montré que sa classe parente, HTML5VideoView, contient un MediaPlayer.