Administra el estado y los recursos de MediaPlayer

En este documento, se abordan dos áreas con posibles dificultades.

  • Estado. Con "Medialayer", algunas operaciones solo son válidas en estados específicos. Las operaciones incorrectas pueden causar excepciones o comportamientos inesperados.

  • Recursos Cuando realizas cambios de configuración, como la rotación de pantalla, debes liberar un objeto MediaPlayer para liberar recursos del sistema y evitar el agotamiento de recursos.

Administrará el estado

MediaPlayer se basa en el estado. Es decir, tiene un estado interno que siempre debes tener en cuenta cuando escribas tu código, porque algunas operaciones solo son válidas cuando el reproductor está en estados específicos. Si realizas una operación en el estado incorrecto, el sistema puede generar una excepción o generar otros comportamientos no deseados.

En el diagrama de estado de la documentación de la clase MediaPlayer, se aclaran qué métodos mueven el MediaPlayer de un estado a otro. Por ejemplo:

  • Cuando creas un nuevo MediaPlayer, está en el estado Idle.
  • Para inicializarlo, llama a setDataSource(), que lo cambia al estado Initialized.
  • Puedes prepararlo con el método prepare() o prepareAsync().
  • Cuando MediaPlayer termina de prepararse, ingresa al estado Prepared, lo que significa que puedes llamar a start() para que reproduzca el contenido.

En ese momento, como se ilustra en el diagrama, puedes cambiar entre los estados Started, Paused y PlaybackCompleted llamando a métodos como start(), pause() y seekTo(), entre otros.

Sin embargo, cuando llames a stop(), observa que no puedes volver a llamar a start() hasta que vuelvas a preparar el MediaPlayer.

Siempre debes tener en cuenta el diagrama de estado cuando escribas código que interactúe con un objeto MediaPlayer, ya que llamar a sus métodos desde el estado incorrecto es una causa común de errores.

Cómo liberar MediaPlayer

Un MediaPlayer puede consumir recursos valiosos del sistema. Por lo tanto, siempre debes tomar precauciones adicionales para asegurarte de no prolongar una instancia de MediaPlayer más de lo necesario. Cuando termines con esto, siempre debes llamar a release() para asegurarte de que se liberen correctamente todos los recursos del sistema asignados.

Por ejemplo, si usas un MediaPlayer y tu actividad recibe una llamada a onStop(), debes liberar el MediaPlayer, ya que no tiene sentido mantenerlo mientras tu actividad no interactúa con el usuario (a menos que estés reproduciendo contenido multimedia en segundo plano, lo que se analiza en la siguiente sección).

Por supuesto, cuando se reanude o reinicie tu actividad, deberás crear un nuevo MediaPlayer y volver a prepararlo antes de reanudar la reproducción.

A continuación, se muestra cómo debes retirar y, luego, anular tu MediaPlayer:

Kotlin

mediaPlayer?.release()
mediaPlayer = null

Java

mediaPlayer.release();
mediaPlayer = null;

Como ejemplo, considera los problemas que surgen si te olvidas de liberar el MediaPlayer cuando se detiene tu actividad, pero creas uno nuevo cuando la actividad vuelve a comenzar. Cuando el usuario cambia la orientación de la pantalla (o cambia la configuración del dispositivo de otra manera), el sistema reinicia la actividad de forma predeterminada. Es posible que consumas rápidamente todos los recursos del sistema a medida que el usuario gira el dispositivo entre la orientación vertical y la horizontal, ya que, con cada cambio de orientación, creas un nuevo MediaPlayer que nunca liberas.

Para obtener más información sobre los reinicios durante el tiempo de ejecución, consulta Cómo controlar los cambios en el tiempo de ejecución.

Tal vez te preguntes qué sucede si deseas continuar reproduciendo "contenido en segundo plano", incluso cuando el usuario deja tu actividad, de una manera similar al comportamiento de la app de música incorporada. En este caso, lo que necesitas es un MediaPlayer controlado por un servicio, como se explica en la siguiente sección.

Más información

Jetpack Media3 es la solución recomendada para la reproducción de contenido multimedia en tu app. Obtén más información al respecto.

En estas páginas, se analizan temas relacionados con la grabación, el almacenamiento y la reproducción de audio y video: