WebView et HTML5 <video>
Je suis rabouter un cheapo application qui, entre autres choses, les "frames" certains de nos sites web... Assez simple avec le WebViewClient
. jusqu'à ce que je frappe la vidéo.
La vidéo est fait comme HTML5
éléments, et ces travaux fine et dandy sur Chrome, iphone, et maintenant que nous avons résolu les problèmes d'encodage, il fonctionne très bien sur Android
dans le navigateur natif.
Maintenant que le bât blesse: WebView
ne l'aime pas. À tous. Je peux cliquer sur l'image d'affiche et rien ne se passe.
Recherche sur google, j'ai trouvé cette qui est proche, mais semble être fondée sur un "lien" (comme dans a href...) au lieu d'un élément vidéo. (onDownloadListener ne semble pas appelée sur les éléments de la vidéo...)
J'ai aussi voir les références à la redéfinition de onShowCustomView, mais qui ne semble pas appelée sur les éléments de la vidéo... ni shouldOverrideUrlLoading..
Je préfère ne pas entrer dans "tirez xml depuis le serveur, reformatez-la dans l'app".. en gardant l'histoire de mise en page sur le serveur, je peut en contrôler le contenu un peu mieux sans forcer les gens à continuer à mettre à jour une application. Donc, si je peux convaincre WebView pour gérer les balises comme le navigateur natif, ce serait mieux.
Je suis il manque clairement quelque chose d'évident.. mais je n'ai aucune idée de ce qu'.
- Voir: code.google.com/p/android/issues/detail?id=22254
- Le long de ces mêmes lignes, je suis à la recherche d'un lecteur HTML5 pour mon site. Que dois-je utiliser?
- Ma réponse ici: stackoverflow.com/a/16179544/423171
- Rien n'a fonctionné alors j'ai regardé dans
VideoEnabledWebView
ici stackoverflow.com/questions/15768837/...
Vous devez vous connecter pour publier un commentaire.
Je réponds à ce sujet, juste au cas où quelqu'un le lire et s'intéresse sur le résultat.
Il est possible de visualiser un élément de vidéo (la vidéo html5 tag) dans une WebView, mais je dois dire que j'ai eu à traiter avec elle pour quelques jours. Ce sont les étapes que j'ai eu à suivre pour autant:
-Trouver un encodés correctement vidéo
-Lors de l'initialisation de la WebView, ensemble le JavaScript, des Plugins les WebViewClient et la WebChromeClient.
-Gérer les onShowCustomView dans le WebChromeClient objet.
-Gérer les onCompletion et la onError événements pour la vidéo, afin de revenir à l'affichage web.
Mais maintenant, je dois dire qu'il y a toujours un problème important. Je peux jouer qu'une seule fois. La deuxième fois que je clique sur la vidéo répartiteur (soit l'affiche ou certaines bouton de lecture), il ne fait rien.
Je voudrais également que la vidéo à jouer à l'intérieur de la WebView image, au lieu d'ouvrir le Lecteur Multimédia de la fenêtre, mais c'est pour moi une question secondaire.
J'espère que cela aide quelqu'un, et je voudrais aussi remercier tout commentaire ou suggestion.
Saludos, terrícolas.
WebChromeClient
et de remplacer les méthodes correspondantes dont vous avez besoin. Si vous insistez, je peux uploader le reste de la classe, plus tard, quand je rentre à la maison.a.setContentView(video);
Comment puis-je obtenir de l'instance d'activité dans mon WebChromeClient? Dois-je passer dans le constructeur?Après de longues recherches, j'ai eu cette chose à travailler. Voir le code suivant:
Test.java
HTML%VIDEO.java
custom_screen.xml
video_loading_progress.xml
colors.xml
Manifest.xml
Attend reste des choses que vous pouvez comprendre.
mdelolmo la réponse a été incroyablement utile, mais comme il le dit, la vidéo ne joue qu'une fois et puis vous ne pouvez pas l'ouvrir à nouveau.
J'ai regardé un peu et voici ce que j'ai trouvé, dans le cas de las WebView voyageurs comme moi de tomber sur ce post à l'avenir.
Tout d'abord, j'ai regardé la VideoView et MediaPlayerla documentation et a obtenu une meilleure idée de la façon dont ces travaux. Je recommande fortement ces.
Puis, j'ai regardé la code source pour voir comment le Navigateur Android t-il. Faire une page trouver et regarder comment ils traitent les
onShowCustomView()
. Ils gardent une référence à laCustomViewCallback
et à la vue personnalisée.Avec tout ça, et avec mdelolmo de répondre à l'esprit, lorsque vous avez terminé avec la vidéo, tout ce que vous devez faire est de deux choses. Tout d'abord, sur le
VideoView
que vous avez enregistré une référence à l'appelstopPlayback()
qui sortira leMediaPlayer
pour être utilisé plus tard ailleurs. Vous pouvez le voir dans le VideoView code source. Deuxièmement, sur leCustomViewCallback
vous avez enregistré une référence à l'appelCustomViewCallback.onCustomViewHidden()
.Après avoir fait ces deux choses, vous pouvez cliquer sur la même vidéo ou toute autre vidéo et il va s'ouvrir comme avant. Pas besoin de redémarrer l'ensemble de la WebView.
Espère que ça aide.
En fait, il semble suffisant de simplement attacher un stock WebChromeClient à la vue du client, ala
et vous avez besoin d'avoir de l'accélération matérielle activée!
Au moins, si vous n'avez pas besoin de lire une vidéo en plein écran, il n'y a pas besoin de tirer sur le VideoView de la WebView et le pousser dans l'Activité de la vue. Il va jouer dans la vidéo de l'élément attribué rect.
Des idées comment intercepter la vidéo expand bouton?
Je sais que ce fil est vieux de plusieurs mois, mais j'ai trouvé une solution pour la lecture de la vidéo à l'intérieur de la WebView sans le faire en plein écran (mais toujours dans le lecteur multimédia...). Jusqu'à présent, je n'ai pas trouvé le moindre indice sur ce sur internet, alors c'est peut-être aussi intéressant pour les autres.
J'ai encore des difficultés sur certains points (c'est à dire de placer le lecteur multimédia dans la partie droite de l'écran, je ne sais pas pourquoi je suis en train de faire le mal, mais c'est un relativement petit problème je pense...).
Dans la Coutume ChromeClient spécifier LayoutParams:
Mon onShowCustomView méthode ressemble à ceci:
Donc, j'espère que je pourrais aider... moi aussi j'avais un jeu vidéo-Codage et vu différents types d'utilisation de la WebView avec html5 vidéo à la fin de mon code de travail est sauvage, le mélange de plusieurs types de code-pièces que j'ai trouvé dans l'internet et certaines choses que j'ai dû comprendre par moi-même. C'était vraiment une douleur dans le*.
Cette approche fonctionne très bien jusqu'à 2.3
Et en ajoutant hardwareaccelerated=true il fonctionne même de 3,0 à ICS
Un problème je suis confronté actuellement est lors de la deuxième lancement de l'application de lecteur multimédia est d'obtenir écrasé parce que je n'ai pas arrêté la lecture, et publié Media player.
Comme VideoSurfaceView objet, ce qui nous recevons dans onShowCustomView fonction depuis la version 3.0 de l'OS, sont spécifiques au navigateur et non pas un VideoView objet que dans, jusqu'à 2.3 OS
Comment puis-je y accéder et stopPlayback et de libérer des ressources?
A-M est semblable à ce que le BrowerActivity n'.
pour
FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams (768, 512);
Je crois que nous pouvons utiliser
à la place.
Un autre problème que j'ai rencontré est de savoir si la vidéo est en lecture, et que l'utilisateur clique sur le bouton de retour, la prochaine fois que vous allez à cette activité(singleTop) et ne peut pas lire la vidéo. pour résoudre ce problème, j'ai appelé le
dans l'activité de onBackPressed méthode.
Je sais que c'est une très vieille question, mais avez-vous essayé le
hardwareAccelerated="true"
manifeste drapeau de votre application ou de l'activité?Avec cet ensemble, il semble fonctionner sans WebChromeClient modification (qui je peut attendre d'un DOM-Élément.)
hardwareAccelerated
commence à partir de Android 3.0J'ai utilisé html5webview pour résoudre ce problème.Télécharger et le mettre dans votre projet, vous pouvez coder comme ça.
Pour faire de la vidéo rotatif, mettre android:configChanges="orientation" du code dans votre Activité
par exemple (Androidmanifest.xml)
et remplacer le onConfigurationChanged méthode.
Cette question est ans, mais peut-être que ma réponse sera aider les gens comme moi qui ont à supporter les anciennes version d'Android. J'ai essayé beaucoup de différentes approches qui ont travaillé sur certaines versions d'Android, mais pas sur tous. La meilleure solution que j'ai trouvé est d'utiliser le Tableau De Concordance De L'Webview qui est optimisé pour HTML5 support de la fonction et fonctionne sur Android 4.1 et supérieur. Il est aussi simple à utiliser que la valeur par défaut d'Android WebView. Il suffit d'inclure la bibliothèque. Ici vous pouvez trouver un tutoriel sur la façon de l'utiliser: https://diego.org/2015/01/07/embedding-crosswalk-in-android-studio/
Eh bien, apparemment ce n'est tout simplement pas possible sans l'aide d'un JNI enregistrer un plugin pour obtenir la vidéo de l'événement. (Personnellement, j'évite JNI est depuis que je n'ai vraiment pas envie de traiter avec un gâchis lorsque l'Atome de base des tablettes android de sortir dans les prochains mois, la perte de la portabilité de Java.)
La seule vraie alternative semble être de créer une nouvelle page web juste pour WebView et de faire de la vidéo old school, avec UN a HREF lien cité dans la Codelark url ci-dessus.
Dégueulasse.
Sur nid d'utilisation
hardwareaccelerated=true
etpluginstate.on_demand
semble fonctionnerJ'ai eu un problème similaire. J'avais des fichiers HTML et des vidéos dans les actifs-dossier de mon application.
Donc les vidéos ont été situé à l'intérieur de l'APK. Parce que l'APK est vraiment un fichier ZIP, le WebView n'a pas été en mesure de lire les vidéos.
Copier tout le code HTML et vidéo des fichiers sur la Carte SD a fonctionné pour moi.