2012-05-21 9 views
8

C'è comunque che è possibile effettuare l'applicazione mantiene il buffer dopo orientamento senza la manipolazione manualmente le modifiche di configurazione.Assicurarsi buffer video è conservata dopo le modifiche di orientamento senza la manipolazione onConfiguration cambia manualmente

Lo scenario sostanzialmente:

  1. Video tampone fino al punto più recente deve essere conservato quando cambia l'orientamento.

  2. È necessario ricaricare un nuovo layout (perché portait e lanscape hanno layout diversi), Pertanto, il riavvio dell'attività per il ricaricamento di nuove risorse è il modo migliore che penso.

  3. componente Il video è in un frammento.

Alternative che ho provato, ma non sono accettabili:

  1. Il primo lavoro intorno è quello di salvare la posizione del video e dopo la vista è stato creato, utilizzare seekTo per andare all'ultima punto. Tuttavia, ciò causerà nuovamente il re-buffer del dispositivo.

  2. Ho provato a giocare con framment setRetainInstance (true) e assicurarmi che il lettore multimediale non venga reinizializzato dopo i cambi di orientamento. Dopo ogni onCreateView, ho appena impostato il mediaplayer.setDisplay() per un nuovo surfaceholder. Sfortunatamente ciò causa che il lettore multimediale vada in stato di errore che a sua volta richiede la reimpostazione del lettore multimediale.

Qualche suggerimento/soluzione alternativa?

Modificato: ho visto da qualche parte in StackOverflow che è possibile cambiare il titolare superficie mediaplayer mentre il mediaplayer è attiva in 4.0+ Android. Tuttavia, sto sviluppando un'applicazione per Android 3.x.

+0

vedere se la mia risposta [qui] (http://stackoverflow.com/questions/9987042/videoview-onresume-loses-buffered-portion-of-the-video/10368107#10368107) aiuta. – yorkw

+0

@yorkw ma questo significa hackerare Android.jar. Destra? Qualunque modo tu sappia farlo per il mainstream? E anche per assicurarti che il Play Store lo accetti? – nembleton

+1

O incidere un copia di VideoView (non l'android.jar reale) o costruire il proprio VideoView dal MediaPlayer, il punto chiave qui è quello di evitare correttamente la chiamata al metodo che causano ri-buffer o tampone pulito durante il cambio di configurazione (più preziosamente, in i metodi di callback del ciclo di vita di entrambe le attività e i metodi di callback di SurfaceHolder). – yorkw

risposta

0

Penso che si possa ignorare onConfigurationChanged() e fare re-impaginazione programatically.

È possibile modificare il layout senza toccare il video.

+0

Grazie per la risposta. Non è possibile fare il relayout quando ci sono molti componenti coinvolti. – Maziz

+1

Quindi, che ne dici di utilizzare il frammento separato per il layout e la visualizzazione del video? – lulumeya

+1

Vuoi dire che 1 frammento mostrerà la vista e un altro sarà frammentato? Facendolo, il lettore multimediale nel frammento trattenuto verrà gettato nello stato di errore perché la vista della superficie è stata modificata. – Maziz

0

Forse è tardi per voi, ma ci possono essere altri che affrontano lo stesso problema. È possibile utilizzare la seconda opzione. se non si imposta la visualizzazione di MediaPlayer su null prima di distruggere la vista del frammento, quando si accede a mediaplayer di nuovo è in esecuzione in stato di errore. La mia soluzione stava implementando gli eventi SurfaceCreated e SurfaceDestroyed del surfaceholder.

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    mediaPlayer.setDisplay(holder); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    mediaPlayer.setDisplay(null); 
} 
+0

Lo scoprirò dopo ... – Maziz

0

Non credo che la sua possibile mantenere il buffer durante la rotazione in Android senza utilizzare l'androide: configChanges bandiere. Queste sono le opzioni disponibili:

  1. consentire la rotazione e l'attività ricreativa, ma salvare la posizione del video. Questo perderà il buffer ma ti consentirà di continuare dall'ultima posizione. Questo non funziona con i live streaming, solo per file locali o VOD remoti. Si dovrà salvare la posizione nella onSaveInstanceState e ripristinarlo in onCreate per un'attività/frammento. O mantenere il valore utilizzando setRetainInstance(true) ma quest'ultima opzione non è consigliata.

  2. Utilizzare i flag android:configChanges="orientation|screenSize" e gestire autonomamente la modifica della dimensione dell'interfaccia utente. Dai un'occhiata a questo POC come riferimento: https://github.com/caspercba/POCMediaPlayerRotation

  3. Scegli un player di terze parti come NexStreaming.

Acclamazioni

Problemi correlati