Estou montando um aplicativo barato que, entre outras coisas, "enquadra" alguns de nossos sites ... Bastante simples com o WebViewClient
. até eu clicar no vídeo.
O vídeo é feito como HTML5
elementos, e eles funcionam bem no Chrome, nos iPhones e agora que corrigimos os problemas de codificação nos quais ele funciona muito bem no Android
navegador nativo.
Agora o problema: WebView
não gosta. Em absoluto. Posso clicar na imagem do pôster e nada acontece.
Pesquisando no Google, achei isso próximo, mas parece basear-se em um 'link' (como em um href ...) em vez de em um elemento de vídeo. (onDownloadListener não parece ser chamado nos elementos de vídeo ...)
Também vejo referências à substituição do onShowCustomView, mas isso parece não ser chamado nos elementos de vídeo ... nem shouldOverrideUrlLoading ..
Prefiro não entrar em "puxar xml do servidor, reformatá-lo no aplicativo". Mantendo o layout da história no servidor, posso controlar o conteúdo um pouco melhor sem forçar as pessoas a continuar atualizando um aplicativo. Portanto, se eu puder convencer o WebView a manipular tags como o navegador nativo, seria melhor.
Estou claramente perdendo algo óbvio ... mas não tenho idéia do que.
VideoEnabledWebView
aqui stackoverflow.com/questions/15768837/…Respostas:
Respondo a este tópico, caso alguém o leia e esteja interessado no resultado. É possível visualizar um elemento de vídeo (tag video html5) em um WebView, mas devo dizer que tive que lidar com ele por alguns dias. Estes são os passos que tive que seguir até agora:
-Encontre um vídeo codificado corretamente
-Quando inicializar o WebView, defina o JavaScript, Plug-ins, o WebViewClient e o WebChromeClient.
-Manuseie o onShowCustomView no objeto WebChromeClient.
-Manuseie os eventos onCompletion e onError do vídeo, para voltar à exibição na web.
Mas agora devo dizer que ainda há uma questão importante. Eu posso tocar apenas uma vez. Na segunda vez que clico no distribuidor de vídeo (no pôster ou em algum botão de reprodução), ele não faz nada.
Também gostaria que o vídeo fosse reproduzido dentro do quadro do WebView, em vez de abrir a janela do Media Player, mas isso é para mim um problema secundário.
Espero que ajude alguém, e também gostaria de agradecer qualquer comentário ou sugestão.
Saludos, terrícolas.
fonte
WebChromeClient
e substituir os métodos correspondentes necessários. Se você insistir, posso enviar o restante da aula mais tarde quando chegar em casa.Após uma longa pesquisa, consegui fazer isso funcionar. Veja o seguinte código:
Test.java
HTML% VIDEO.java
custom_screen.xml
video_loading_progress.xml
colors.xml
Manifest.xml
Esperando o resto das coisas que você pode entender.
fonte
A resposta de mdelolmo foi incrivelmente útil, mas, como ele disse, o vídeo é reproduzido apenas uma vez e você não pode abri-lo novamente.
Analisei um pouco isso e eis o que encontrei, caso algum viajante cansado do WebView como eu tropeçar neste post no futuro.
Primeiro, examinei a documentação do VideoView e do MediaPlayer e tive uma melhor noção de como elas funcionam. Eu recomendo fortemente aqueles.
Então, olhei o código-fonte para ver como o Navegador Android faz isso. Faça uma página encontrar e vá ver como eles lidam
onShowCustomView()
. Eles mantêm uma referência àCustomViewCallback
exibição personalizada e.Com tudo isso, e com a resposta de mdelolmo em mente, quando você terminar o vídeo, tudo o que você precisa fazer é duas coisas. Primeiro, na
VideoView
qual você salvou uma referência, a chamadastopPlayback()
que liberará aMediaPlayer
será usada posteriormente em outro lugar. Você pode vê-lo no código fonte do VideoView . Segundo,CustomViewCallback
você salvou uma referência para ligarCustomViewCallback.onCustomViewHidden()
.Depois de fazer essas duas coisas, você pode clicar no mesmo vídeo ou em qualquer outro vídeo e ele abrirá como antes. Não há necessidade de reiniciar todo o WebView.
Espero que ajude.
fonte
Na verdade, parece suficiente apenas anexar um WebChromeClient de ações à visão do cliente, ala
e você precisa ter a aceleração de hardware ativada!
Pelo menos, se você não precisar reproduzir um vídeo em tela cheia, não será necessário puxar o VideoView para fora da WebView e empurrá-lo para a visualização da Atividade. Ele será reproduzido no retângulo alocado do elemento de vídeo.
Alguma idéia de como interceptar o botão de expansão de vídeo?
fonte
Sei que este tópico tem vários meses, mas encontrei uma solução para reproduzir o vídeo dentro do WebView sem fazê-lo em tela cheia (mas ainda no media player ...). Até agora, não encontrei nenhuma dica sobre isso na internet, então talvez isso também seja interessante para outros. Ainda estou lutando com alguns problemas (ou seja, colocando o media player na seção correta da tela, não sei por que estou fazendo errado, mas acho que é um problema relativamente pequeno ...).
No ChromeClient personalizado, especifique LayoutParams:
Meu método onShowCustomView é assim:
Então, espero poder ajudar ... Eu também tive que brincar com a codificação de vídeo e vi diferentes tipos de uso do WebView com vídeo html5 - no final, meu código de trabalho era uma mistura selvagem de diferentes partes de código encontradas em a internet e algumas coisas que eu tive que descobrir sozinha. Realmente foi uma dor no a *.
fonte
Essa abordagem funciona muito bem até 2.3. E, adicionando hardwareaccelerated = true, funciona até 3.0 para o ICS. Um problema que estou enfrentando atualmente é o segundo lançamento do aplicativo media player que está sendo travado porque eu não parei a reprodução e liberei o Media player. Como o objeto VideoSurfaceView, que obtemos na função onShowCustomView do SO 3.0, é específico para o navegador e não um objeto VideoView como no, até o SO 2.3 Como posso acessá-lo e interromper a reprodução e liberar recursos?
fonte
As AMs são semelhantes às do BrowerActivity . para FrameLayout.LayoutParams LayoutParameters = novo FrameLayout.LayoutParams (768, 512);
Acho que podemos usar
em vez de.
Outro problema que encontrei é se o vídeo está sendo reproduzido e o usuário clica no botão Voltar. Na próxima vez, você acessará esta atividade (primeira opção única) e não poderá reproduzir o vídeo. para consertar isso, chamei o
no método onBackPressed da atividade.
fonte
Sei que essa é uma pergunta muito antiga, mas você já tentou o
hardwareAccelerated="true"
sinalizador de manifesto para seu aplicativo ou atividade?Com esse conjunto, ele parece funcionar sem nenhuma modificação do WebChromeClient (o que eu esperaria de um elemento DOM).
fonte
hardwareAccelerated
inicia a partir do Android 3.0Eu usei o html5webview para resolver esse problema. Faça o download e coloque-o no seu projeto para poder codificar da seguinte maneira.
Para tornar o vídeo rotativo, coloque o código android: configChanges = "guidance" em sua Atividade, por exemplo (Androidmanifest.xml)
e substitua o método onConfigurationChanged.
fonte
Esta pergunta tem anos, mas talvez minha resposta ajude pessoas como eu que precisam oferecer suporte à versão antiga do Android. Eu tentei várias abordagens diferentes que funcionavam em algumas versões do Android, mas não em todas. A melhor solução que encontrei é usar o Crosswalk Webview, que é otimizado para suporte a recursos HTML5 e funciona no Android 4.1 e superior. É tão simples de usar quanto o Android WebView padrão. Você apenas precisa incluir a biblioteca. Aqui você encontra um tutorial simples de como usá-lo: https://diego.org/2015/01/07/embedding-crosswalk-in-android-studio/
fonte
Bem, aparentemente isso não é possível sem o uso de um JNI para registrar um plug-in para obter o evento de vídeo. (Pessoalmente, estou evitando JNIs, já que realmente não quero lidar com uma bagunça quando os tablets Android baseados em Atom forem lançados nos próximos meses, perdendo a portabilidade do Java.)
A única alternativa real parece ser criar uma nova página da Web apenas para o WebView e gravar vídeos da maneira antiga com um link A HREF, conforme mencionado no URL do Codelark acima.
Icky.
fonte
No uso do favo de mel
hardwareaccelerated=true
epluginstate.on_demand
parece funcionarfonte
Eu tive um problema parecido. Eu tinha arquivos e vídeos HTML na pasta de ativos do meu aplicativo.
Portanto, os vídeos foram localizados dentro do APK. Como o APK é realmente um arquivo ZIP, o WebView não conseguiu ler os arquivos de vídeo.
Copiar todos os arquivos HTML e de vídeo para o cartão SD funcionou para mim.
fonte