Manter vídeo tocando (preservar buffer e etc) num fragmento quando rotacionar o device sem manipular o layout XML manualmente.

31 views
Skip to first unread message

Idemax Green

unread,
Apr 1, 2014, 8:32:02 AM4/1/14
to androidb...@googlegroups.com
Bom dia pessoal,

Há alguns dias estou trabalhando num workaround do problema citado no título, basicamente tenho dois XMLs com layouts diferentes para PORT e LAND quais possuem um fragment comum, que por sua vez tem um VideoView (ou Media Player inserido via código, tanto faz). No cenário ideal eu não defino o configChanges no Manifest para ouvir as mudanças de orientação e não dou override no onConfigurationChanged na activity pai para que o OS cuide da troca de layout. Porém quando isso acontece e o vídeo está no meio ele reinicia, sei que isso é causado porque o OS reconstrói a activity, layouts, etc...

Já estou definindo o retain instance do fragment para TRUE porém ele só mantem a instância, e por se tratar de um primo do activity, cai no mesmo ciclo de reconstrução devido a sofrer o detached e attached. Também já testei manter instância do VideoPlayer e re-adicionar num novo view, porém como os componentes criados dinamicamente precisam de um contexto, quando a rotação reinicia a Activity trata-se de um novo contexto.

Achei esses links que dão algumas sugestões, porém a mais elegante julguei ser manipular a adição e remoção de fragments manualmente.


Alguém já passou por isso? Já resolveu isso de outra forma?

Obrigado, abraços.

Victor Pinto

unread,
Apr 1, 2014, 3:57:00 PM4/1/14
to androidb...@googlegroups.com
Idemax,
   Pra mim funcionou com o esquema de RetainInstance. Mas você só cria ele uma vez:

// Check to see if we have retained the worker fragment.
String tagWorkFrag = "workVideocast";
mWorkFragment = (WorkVideoFrag) fm.findFragmentByTag(tagWorkFrag);

// If not retained (or first time running), we need to create it.
if (mWorkFragment == null) {
   mWorkFragment = new WorkVideoFrag();
   Bundle params = new Bundle();
   params.putParcelable(VideocastTO.PARAM, videocastTO);
   mWorkFragment.setArguments(params);
   .
   fm.beginTransaction().add(mWorkFragment, tagWorkFrag).commit();

Idemax Green

unread,
Apr 1, 2014, 5:55:20 PM4/1/14
to androidb...@googlegroups.com
Oi Victor,

Então cara, eu estou fazendo o mesmo. E mesmo com retain instance setado para TRUE o vídeo não continua tocando direto (estilo YouTube) após a rotação. Estou te enviando o projeto para olhar o cenário modelo. Tem a MainActivity que tem um fragmento MyFragment que por sua vez roda um vídeo em loop (o vídeo está na raiz do projeto, só copiar para a raiz do DCIM do device).

Obrigado pela resposta, abraços.
Marcelo L. Filho
+55 (16) 9339-6230
www.idemax.net
twitter.com/idemax


--
You received this message because you are subscribed to a topic in the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/androidbrasil-dev/DiXsnTmFL5k/unsubscribe.
To unsubscribe from this group and all its topics, send an email to androidbrasil-...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

fragtest.zip

Victor Pinto

unread,
Apr 3, 2014, 1:28:06 PM4/3/14
to androidb...@googlegroups.com
Marcelo,
   O que eu fiz foi com dois fragmentos, um que só tem o SurfaceView (chamo de ViewFragment) e o outro que tem a propriedade setRetainInstance(true); e o atributo MediaPlayer (chamo de WorkFragment). Assim o vídeo fica sempre tocando no WorkFragment e nunca é destruido, e o View só exibe o vídeo podendo ser destruido e criado novamente e vai referenciar o mesmo WorkFragment que existia antes.

Marcelo L. Filho

unread,
Apr 3, 2014, 1:39:09 PM4/3/14
to androidb...@googlegroups.com
Então Victor, mas os XMLs dos layouts em port e land são diferentes? Você está tratando o onConfigurationChanged na activity principal?

Porque se for o mesmo XML (o arquivo em sí) o problema não vai aparecer, e se vc estiver sobrescrevendo o onConfigurationChanged (com o atributo android:configChanges="orientation|screenSize" no Manifest) também não vai.


Marcelo L. Filho, BCS
Software Developer @ Samsung Institute for Development Informatics (SIDIA)
개발 정보학 삼성 연구소에서 소프트웨어 개발자 (SIDIA)

C: +55 (16) 99339-6230

Victor Pinto

unread,
Apr 3, 2014, 1:56:59 PM4/3/14
to androidb...@googlegroups.com, marcel...@gmail.com
Dois XML diferentes. Em land era full e port tinha uns TextViews. 
Não sobrescrevi o onConfigurationChange.

Victor Pinto

unread,
Apr 3, 2014, 2:34:44 PM4/3/14
to androidb...@googlegroups.com, marcel...@gmail.com
Marcelo,
   Modifiquei o seu projeto mais ou menos como ficou o meu. Uma diferença é que no meu o carregamento do link era dinâmico e o carregamento do vídeo era assíncrono.
FragmentRotationSample 2.zip

Marcelo L. Filho

unread,
Apr 3, 2014, 2:58:50 PM4/3/14
to Victor Pinto, androidb...@googlegroups.com
Caramba! Rsss... Em qual device vc tem testado isso? Pelo que testei com aquele projeto que te mandei o vídeo reiniciava sempre pq a surface sai da tela.


Marcelo L. Filho, BCS
Software Developer @ Samsung Institute for Development Informatics (SIDIA)
개발 정보학 삼성 연구소에서 소프트웨어 개발자 (SIDIA)

C: +55 (16) 99339-6230


Victor Pinto

unread,
Apr 3, 2014, 3:41:43 PM4/3/14
to androidb...@googlegroups.com, Victor Pinto, marcel...@gmail.com
Testei num emulador Genymotion Nexus 4 v4.2.2

Marcelo L. Filho

unread,
Apr 3, 2014, 4:12:24 PM4/3/14
to Victor Pinto, androidb...@googlegroups.com

Cara testa num device pra ver se da na mesma. Por favor... Pq acho q pode set algumas especialidade do AVD.

Enviado pelo meu Android.

Marcelo L. Filho
+55 (16) 99339-6230

Reply all
Reply to author
Forward
0 new messages