Je suis en train de créer une application cheapo qui, entre autres, "encadre" certains de nos sites Web ... Assez simple avec le WebViewClient
. jusqu'à ce que je frappe la vidéo.
La vidéo est réalisée sous forme d' HTML5
éléments, et ceux-ci fonctionnent très bien sur Chrome, les iPhones, et maintenant que nous avons résolu les problèmes d'encodage, cela fonctionne très bien Android
dans le navigateur natif.
Maintenant, le hic: WebView
je n'aime pas ça. Du tout. Je peux cliquer sur l'image de l'affiche et rien ne se passe.
En googlant, j'ai trouvé cela qui est proche, mais qui semble être basé sur un «lien» (comme dans un href ...) au lieu d'un élément vidéo. (onDownloadListener ne semble pas être appelé sur les éléments vidéo ...)
Je vois également des références à la substitution de onShowCustomView, mais cela ne semble pas être appelé sur les éléments vidéo ... ni shouldOverrideUrlLoading ..
Je préférerais ne pas "extraire du xml du serveur, le reformater dans l'application" .. en gardant la mise en page de l'histoire sur le serveur, je peux contrôler un peu mieux le contenu sans forcer les gens à continuer à mettre à jour une application. Donc, si je peux convaincre WebView de gérer des balises comme le navigateur natif, ce serait mieux.
Il me manque clairement quelque chose d'évident ... mais je n'ai aucune idée de quoi.
VideoEnabledWebView
ici stackoverflow.com/questions/15768837/…Réponses:
Je réponds à ce sujet au cas où quelqu'un le lirait et serait intéressé par le résultat. Il est possible de visualiser un élément vidéo (tag video html5) dans une WebView, mais je dois dire que j'ai dû m'en occuper pendant quelques jours. Voici les étapes que j'ai dû suivre jusqu'à présent:
-Trouver une vidéo correctement encodée
-Lors de l'initialisation de WebView, définissez le JavaScript, les plug-ins WebViewClient et WebChromeClient.
-Gérer le onShowCustomView dans l'objet WebChromeClient.
-Gérer les événements onCompletion et onError pour la vidéo, afin de revenir à la vue Web.
Mais maintenant, je devrais dire qu'il reste un problème important. Je ne peux y jouer qu'une seule fois. La deuxième fois que je clique sur le répartiteur vidéo (soit l'affiche, soit un bouton de lecture), il ne fait rien.
Je voudrais également que la vidéo soit lue à l'intérieur du cadre WebView, au lieu d'ouvrir la fenêtre du lecteur multimédia, mais c'est pour moi un problème secondaire.
J'espère que cela aide quelqu'un, et je remercie également tout commentaire ou suggestion.
Saludos, terrícolas.
la source
WebChromeClient
et remplacer les méthodes correspondantes dont vous avez besoin. Si vous insistez, je pourrai télécharger le reste de la classe plus tard lorsque je rentrerai à la maison.Après de longues recherches, j'ai fait fonctionner cette chose. Voir le code suivant:
Test.java
HTML% VIDEO.java
custom_screen.xml
video_loading_progress.xml
colors.xml
Manifest.xml
Attendre le reste des choses que vous pouvez comprendre.
la source
La réponse de mdelolmo a été incroyablement utile, mais comme il l'a dit, la vidéo ne joue qu'une seule fois et vous ne pouvez pas l'ouvrir à nouveau.
J'ai examiné cela un peu et voici ce que j'ai trouvé, au cas où des voyageurs WebView fatigués comme moi tomberaient sur ce post à l'avenir.
Tout d' abord, je regardais le VideoView et MediaPlayer la documentation de et a obtenu un meilleur sens de la façon dont les travaux. Je les recommande fortement.
Ensuite, j'ai regardé le code source pour voir comment le navigateur Android le fait. Faites une recherche de page et regardez comment ils gèrent
onShowCustomView()
. Ils gardent une référence à laCustomViewCallback
et à la vue personnalisée.Avec tout cela, et avec la réponse de mdelolmo à l'esprit, lorsque vous avez terminé avec la vidéo, tout ce que vous avez à faire est de deux choses. Tout d'abord, sur le
VideoView
auquel vous avez enregistré une référence, appelezstopPlayback()
qui libérera leMediaPlayer
pour être utilisé plus tard ailleurs. Vous pouvez le voir dans le code source de VideoView . Deuxièmement,CustomViewCallback
vous avez enregistré une référence à appelerCustomViewCallback.onCustomViewHidden()
.Après avoir fait ces deux choses, vous pouvez cliquer sur la même vidéo ou sur n'importe quelle autre vidéo et elle s'ouvrira comme avant. Pas besoin de redémarrer l'intégralité de WebView.
J'espère que cela pourra aider.
la source
En fait, il semble suffisant de simplement attacher un stock WebChromeClient à la vue client, ala
et vous devez activer l'accélération matérielle!
Au moins, si vous n'avez pas besoin de lire une vidéo en plein écran, il n'est pas nécessaire d'extraire le VideoView de WebView et de le pousser dans la vue de l'activité. Il sera lu dans le rectangle alloué de l'élément vidéo.
Des idées pour intercepter le bouton de développement de la vidéo?
la source
Je sais que ce fil a plusieurs mois, mais j'ai trouvé une solution pour lire la vidéo dans WebView sans le faire en plein écran (mais toujours dans le lecteur multimédia ...). Jusqu'à présent, je n'ai trouvé aucun indice à ce sujet sur Internet, alors peut-être que c'est aussi intéressant pour d'autres. J'ai encore du mal sur certains problèmes (c'est-à-dire placer le lecteur multimédia dans la bonne section de l'écran, je ne sais pas pourquoi je le fais mal mais c'est un problème relativement petit je pense ...).
Dans le ChromeClient personnalisé, spécifiez LayoutParams:
Ma méthode onShowCustomView ressemble à ceci:
Donc, j'espère que je pourrais aider ... J'ai aussi dû jouer avec l'encodage vidéo et j'ai vu différents types d'utilisation de WebView avec une vidéo html5 - à la fin, mon code de travail était un mélange sauvage de différentes parties de code que j'ai trouvées dans Internet et certaines choses que je devais résoudre moi-même. C'était vraiment une douleur dans le a *.
la source
Cette approche fonctionne très bien jusqu'à 2.3 Et en ajoutant hardwareaccelerated = true, cela fonctionne même de 3.0 à ICS Un problème auquel je suis actuellement confronté est que le deuxième lancement de l'application de lecteur multimédia se bloque parce que je n'ai pas arrêté la lecture et publié le lecteur multimédia. En tant qu'objet VideoSurfaceView, que nous obtenons dans la fonction onShowCustomView à partir du système d'exploitation 3.0, sont spécifiques au navigateur et non à un objet VideoView comme dans, jusqu'à 2.3 OS Comment puis-je y accéder et arrêter la lecture et libérer des ressources?
la source
AM est similaire à ce que fait le BrowerActivity . pour FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams (768, 512);
Je pense que nous pouvons utiliser
au lieu.
Un autre problème que j'ai rencontré est si la vidéo est en cours de lecture et que l'utilisateur clique sur le bouton Retour, la prochaine fois, vous accédez à cette activité (singleTop one) et ne pouvez pas lire la vidéo. pour résoudre ce problème, j'ai appelé le
dans la méthode onBackPressed de l'activité.
la source
Je sais que c'est une question très ancienne, mais avez-vous essayé l'
hardwareAccelerated="true"
indicateur de manifeste pour votre application ou activité?Avec cet ensemble, il semble fonctionner sans aucune modification de WebChromeClient (ce que j'attendrais d'un élément DOM.)
la source
hardwareAccelerated
démarre à partir d'Android 3.0J'ai utilisé html5webview pour résoudre ce problème.Téléchargez-le et mettez-le dans votre projet, vous pouvez alors coder comme ça.
Pour rendre la vidéo rotative, placez le code android: configChanges = "orientation" dans votre activité par exemple (Androidmanifest.xml)
et remplacez la méthode onConfigurationChanged.
la source
Cette question a des années, mais ma réponse aidera peut-être des gens comme moi qui doivent prendre en charge l'ancienne version d'Android. J'ai essayé beaucoup d'approches différentes qui fonctionnaient sur certaines versions d'Android, mais pas sur toutes. La meilleure solution que j'ai trouvée est d'utiliser le Crosswalk Webview qui est optimisé pour la prise en charge des fonctionnalités HTML5 et fonctionne sur Android 4.1 et supérieur. Il est aussi simple à utiliser que le WebView Android par défaut. Il vous suffit d'inclure la bibliothèque. Vous trouverez ici un tutoriel simple sur son utilisation: https://diego.org/2015/01/07/embedding-crosswalk-in-android-studio/
la source
Eh bien, apparemment, ce n'est tout simplement pas possible sans utiliser un JNI pour enregistrer un plugin pour obtenir l'événement vidéo. (Personnellement, j'évite les JNI car je ne veux vraiment pas faire face à un désordre lorsque les tablettes Android basées sur Atom sortent dans les prochains mois, perdant 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 à l'ancienne avec un lien A HREF comme cité dans l'url de Codelark ci-dessus.
Icky.
la source
Sur l'utilisation en nid d'abeille
hardwareaccelerated=true
etpluginstate.on_demand
semble fonctionnerla source
J'avais un problème similaire. J'avais des fichiers HTML et des vidéos dans le dossier assets de mon application.
Par conséquent, les vidéos étaient situées à l'intérieur de l'APK. Parce que l'APK est vraiment un fichier ZIP, le WebView n'a pas pu lire les fichiers vidéo.
Copier tous les fichiers HTML et vidéo sur la carte SD a fonctionné pour moi.
la source