Evite la corrupción de Android VideoView al girar de nuevo al retrato

Logré escribir un reproductor de video limitado capaz de ver un archivo .3gp desde Internet. El video se mostrará centrado a pantalla completa, manteniendo la relación de aspecto del video. Además, las rotaciones no interrumpen el video, que sigue reproduciéndose sin problemas.

Todo parece estar bien, pero … en mi HTC Legend cuando gira de nuevo a retrato, el video está dañado, y en lugar de mostrar la pantalla completa, se muestra en su tamaño de píxel original. Pero gira de nuevo a obras de paisaje y se muestra perfectamente. ¿Alguna idea de por qué? Lamentablemente, no tengo más hardware para probar esto y me he quedado sin ideas para probar.

Puede obtener el código fuente completo de ejemplo de https://github.com/gradha/Android-video-stream-rotation . Aquí hay capturas de pantalla de mí abriendo la aplicación, girando al paisaje, tocando la pantalla para mostrar los controles de video, luego girando de nuevo a vertical para ver la corrupción. el video comenzó bien en el retrato

en el paisaje el video funciona bien también

pero ahora volver al retrato siempre muestra corrupción

En el código fuente en https://github.com/gradha/Android-video-stream-rotation . usted agregó el comentario:

Como en el archivo AndroidManifest.xml especificamos que queremos manejar nuestros propios cambios de orientación, cambiamos el tamaño de la pantalla en función de que sea vertical u horizontal.

Del código fuente AndroidManifest.xml

android:configChanges="orientation|screenSize" 

Entonces, si agrega este atributo al elemento de actividad en el manifiesto, lo interpretaría como la actividad manejará todos los cambios de orientación. ¿no tú?

De los desarrolladores de Android

Para declarar que su actividad maneja un cambio de configuración, edite el elemento de actividad apropiado en su archivo de manifiesto para incluir el atributo android: configChanges … más

Entonces no deberías necesitar:

 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } 

Creé un proyecto de prueba para verificar si este era el caso:

Ejemplo de transmisión de video en rotación: https://github.com/TouchBoarder/RotatingVideoStream

Mi conclusión: no tuve que sobreescribir el “onConfigurationChanged” en la actividad para mostrar el video correcto tanto en vertical como en horizontal, y el video sigue reproduciéndose en los cambios de rotación.

Siéntete libre de mejorar y usar el código 🙂

Resulta que todo el caso de prueba estaba mal. Hasta el momento en que cometí el error, el ejemplo fácil de videoview de estar equivocado todo estaba de acuerdo con el libro. Sin embargo, olvidé la línea android:configChanges="orientation" , y al agregar esta línea en la parte superior de la confirmación mencionada anteriormente, todo funciona sin corrupción de video.

Estaré marcando la respuesta de hsigmond como válida para proporcionar un ejemplo de prueba con el que podría comparar y descubrir el verdadero problema. Todo mi trabajo al respecto con controladores de orientación personalizados y una subclase de VideoView estaba mal y se basaba incorrectamente en la pregunta sobre la variación de la orientación de Android VideoView con el video almacenado . No es que eso esté mal, simplemente lo apliqué incorrectamente (además de otras respuestas allí también mencioné el android:configChanges falta android:configChanges ).