Eh bien, je cherche déjà depuis quelques jours, comment afficher une vidéo HTML5 en mode plein écran sur Android WebView.
J'ai réussi à lire des vidéos HTML5 sur ma vue Web. Des problèmes surviennent lors de l'affichage de la vidéo en mode plein écran.
Comme je l'ai compris, Android dispose de deux façons de gérer la balise <video>:
Sur les versions Android <= 2.3.3 , la méthode onShowCustomView est déclenchée, et je peux avoir l'instance VideoView, et définir les auditeurs lorsque la vidéo est terminée, définir les contrôleurs, etc.
Sur ICS (et probablement 3.0 et supérieur) , il semble que la <vidéo> soit gérée de manière différente. Lorsque la vidéo HTML5 est lue, onShowCustomView n'est pas appelée en mode normal - il semble qu'il y ait une entreprise interne à l'intérieur de WebView qui lit la vidéo, et toutes les commandes définies dans la balise <video> sont affichées - I ne peut en aucun cas y accéder. En fait, si la vidéo est lue en mode normal, c'est OK car les commandes sont là et fonctionnent.
Cela m'a conduit au gros problème: lors de l'affichage de la vidéo en mode plein écran, 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 la réflexion.
Après avoir examiné GrepCode pour cette classe, j'ai appris que contrairement à VideoView, le HTML5VideoFullScreen $ VideoSurfaceView ne contient pas d'instance MediaPlayer que je peux écouter ses événements ou accéder à ses contrôles. La seule chose que je peux faire est de prendre ce VideoSurfaceView tel quel et de le placer dans une mise en page plein écran sans le contrôler.
Bottom line - Lors de l'affichage de la vidéo en plein écran, je ne sais pas quand la vidéo se termine, ses commandes ne sont pas affichées - c'est assez triste. Je ne parviens pas à obtenir le déclencheur pour fermer le plein écran.
J'ai essayé quelques solutions de contournement infructueuses:
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 contient pas l'instance de son propriétaire).
Inscrivez-vous aux événements vidéo via Javascript (onended, par exemple), et gérez ce dont j'ai besoin en JAVA via JavascriptInterface: J'ai trouvé que cette solution n'était pas fiable car en faisant cela j'ai rencontré un autre problème: la balise <video> peut être imbriquée dans un. La source iframe n'est pas la mienne et je ne peux pas obtenir son contenu (getElementById ou getElementsByTagName [i] sont des valeurs nulles) - ce qui signifie que je ne peux pas atteindre l'élément <video> dans l'iframe.
Je cherche toujours une solution, très peu est écrit sur ce problème. Quelqu'un a-t-il réussi à le résoudre? Une aide serait très appréciée!
Classe VideoView : Ici (avec MediaPlayer)
Classe HTML5VideoFullScreen $ VideoSurfaceView : Ici (n'a pas MediaPlayer)
Réponses:
Edit 2014/10: à la demande générale, je maintiens et déplace cela sur GitHub. Veuillez vérifier cprcrack / VideoEnabledWebView pour la dernière version. Gardera cette réponse uniquement à titre de référence.
Edit 2014/01: utilisation d'exemple améliorée pour inclure les vues nonVideoLayout, videoLayout et videoLoading, pour les utilisateurs qui demandent plus d'exemples de code pour une meilleure compréhension.
Edit 2013/12: quelques corrections de bugs liés à la compatibilité des appareils Sony Xperia, mais qui affectaient en fait tous les appareils.
Edit 2013/11: après la sortie d'Android 4.4 KitKat (API niveau 19) avec sa nouvelle webview Chromium, j'ai dû travailler à nouveau dur. Plusieurs améliorations ont été apportées. Vous devriez mettre à jour vers cette nouvelle version. Je publie cette source sous WTFPL .
Edit 2013/04: après 1 semaine de travail acharné, j'ai enfin réalisé tout ce dont j'avais besoin. Je pense que ces deux classes génériques que j'ai créées peuvent résoudre tous vos problèmes.
VideoEnabledWebChromeClient
peut être utilisé seul si vous n'avez pas besoin de la fonctionnalité quiVideoEnabledWebView
ajoute. MaisVideoEnabledWebView
doit toujours compter sur unVideoEnabledWebChromeClient
. Veuillez lire attentivement tous les commentaires des deux classes.VideoEnabledWebChromeClient Classe
VideoEnabledWebView Classe
Exemple d'utilisation:
Disposition principale activity_main.xml dans laquelle nous mettons un VideoEnabledWebView et d'autres vues utilisées:
Activity's onCreate () , dans lequel on l'initialise:
Et n'oubliez pas d'appeler onBackPressed () :
la source
Testé sur la version Android 9.0
Aucune des réponses n'a fonctionné pour moi. C'est la dernière chose qui a fonctionné
Dans AndroidManifest.xml
Source Monster Techno
la source
Edit: s'il vous plaît voir mon autre réponse , car vous n'en avez probablement pas besoin maintenant.
Comme vous l'avez dit, dans les niveaux d'API 11+, un HTML5VideoFullScreen $ VideoSurfaceView est passé. Mais je ne pense pas que vous ayez raison de dire que "il n'a pas de MediaPlayer".
Voici le moyen d'accéder à l'instance MediaPlayer à partir de l'instance HTML5VideoFullScreen $ VideoSurfaceView à l'aide de la réflexion :
Vous pouvez maintenant définir l'écouteur onCompletion de l'instance MediaPlayer comme ceci:
Le code n'échoue pas mais je ne suis pas complètement sûr si cet écouteur onCompletion sera vraiment appelé ou s'il pourrait être utile à votre situation. Mais juste au cas où quelqu'un voudrait l'essayer.
la source
Merci beaucoup pour ce cours, Cristian.
J'ai apporté une modification mineure afin que la vue de chargement personnalisée soit facultative, comme ceci:
J'ai également ajouté un nouveau constructeur qui ne prend que deux paramètres. Quoi qu'il en soit, juste une petite simplification si vous n'avez pas besoin de la vue de chargement. Merci encore d'avoir fourni cela.
la source
Juste réglé
mWebView.setWebChromeClient(new WebChromeClient());
et la vidéo est lue comme normalement n'a pas besoin de vue personnalisée.
la source
C'est bien. Mais si vous souhaitez que les liens de votre site Web s'ouvrent dans l'application elle-même, ajoutez ce code dans votre ExampleActivity.java:
la source
La réponse de Cprcrack fonctionne très bien pour les niveaux d'API 19 et moins. Juste un ajout mineur à cprcrack le
onShowCustomView
fera fonctionner au niveau de l'API 21+Vous devrez également refléter les changements dans
onHideCustomView
la source
Il semble que dans Lollipop et plus (ou peut-être juste une version WebView différente) cette
cprcrack's
onHideCustomView()
méthode d' appel ne fonctionne pas. Cela fonctionne s'il est appelé à partir du bouton de sortie plein écran, mais lorsque vous appelez spécifiquement la méthode, il ne quittera que le plein écran maiswebView
reste vide. Une façon de contourner le problème consiste simplement à ajouter ces lignes de code àonHideCustomView()
:Cela informera le WebView que le plein écran est sorti.
la source