2012-05-21 8 views
8

¿Existe alguna forma de que la aplicación mantenga la memoria intermedia después de la orientación sin manejar manualmente los cambios de configuración?Asegurarse de que la memoria intermedia de video se conserva después de cambios de orientación sin manejo. Cambios de configuración manualmente

El escenario básicamente:

  1. vídeo búfer hasta el último punto debe ser preservada cuando cambia la orientación.

  2. Necesito volver a cargar un nuevo diseño (porque portait y lanscape tiene un diseño diferente), Por lo tanto, dejar que la aplicación reinicie la actividad para volver a cargar nuevos recursos es lo mejor que pienso.

  3. El componente de video está en un fragmento.

Alternativas que he intentado pero no son aceptables:

  1. La primera solución es guardar la posición del video y después de la vista ha sido creado, utilice seekTo para ir a la última punto. Sin embargo, esto causará que el dispositivo se vuelva a amortiguar nuevamente.

  2. He intentado jugar con el fragmento setRetainInstance (verdadero) y asegurarme de que el reproductor multimedia no se reinicialice después de que cambie la orientación. Después de cada onCreateView, acabo de configurar mediaplayer.setDisplay() en un nuevo titular de superficie. Desafortunadamente, esto hace que el reproductor de medios entre en estado de error, lo que a su vez requiere que el reproductor de medios sea reiniciado.

¿Alguna sugerencia/solución para esto?

Editado: Vi en algún lugar de stackoverflow que puede cambiar el soporte de la superficie del reproductor de medios mientras el reproductor de medios está activo en Android 4.0+. Sin embargo, estoy desarrollando una aplicación para Android 3.x.

+0

ver si mi respuesta [aquí] (http://stackoverflow.com/questions/9987042/videoview-onresume-loses-buffered-portion-of-the-video/10368107#10368107) ayuda. – yorkw

+0

@yorkw pero esto significa piratear el android.jar. ¿Derecha? De cualquier forma que sepa hacerlo por la corriente principal? ¿Y también para asegurarnos de que Play Store lo acepte? – nembleton

+1

Ya sea hackear una copia de VideoView (no el android.jar real) o construir su propio VideoView desde MediaPlayer, el punto clave aquí es evitar adecuadamente la llamada al método que causa el re-buffer o limpiar el buffer durante el cambio de configuración (más valioso, en los métodos de devolución de llamada del ciclo de vida de ambas actividades y los métodos de devolución de llamada de SurfaceHolder). – yorkw

Respuesta

0

Creo que puede anular enConfigurationChanged() y hacer el redistribución programáticamente.

Puede modificar el diseño sin tocar el video.

+0

Gracias por la respuesta. Simplemente no es posible retransmitir cuando hay muchos componentes involucrados. – Maziz

+1

Entonces, ¿qué tal usar Fragmento por separado para el diseño y la vista de video? – lulumeya

+1

¿Quiere decir que 1 Fragmento mostrará la vista y otro será fragmento conservado? Si lo hace, el reproductor multimedia en el fragmento retenido se lanzará al estado de error porque se modificó la vista de superficie. – Maziz

0

Quizás sea tarde para usted pero puede haber otros que enfrentan el mismo problema. Puede usar la segunda opción. si no configura la visualización de MediaPlayer como nulo antes de destruir la vista del fragmento, cuando vuelva a acceder al reproductor de medios se ejecutará en estado de error. Mi solución fue la implementación de SurfaceCreated y SurfaceDestroyed events of surfaceholder.

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

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

Lo sabré más tarde ... – Maziz

0

No creo que sea posible mantener el búfer mientras gira en Android sin usar los indicadores android: configChanges. Estas son las opciones disponibles:

  1. permitir la rotación y la actividad recreativa, pero guardar la posición de vídeo. Esto perderá el buffer pero le permitirá continuar desde la última posición. Esto no funciona con transmisiones en vivo, solo para archivos locales o VOD remoto. Deberá guardar su posición en onSaveInstanceState y restaurarla en onCreate para una actividad/fragmento. O mantenga el valor usando setRetainInstance(true), pero esta última opción no es recomendable.

  2. Utilice los indicadores android:configChanges="orientation|screenSize" y gestione usted mismo el cambio de tamaño de la interfaz de usuario. Eche un vistazo a este POC como referencia: https://github.com/caspercba/POCMediaPlayerRotation

  3. Elija un reproductor de terceros como NexStreaming.

Saludos

Cuestiones relacionadas