Administra el estado y los recursos de MediaPlayer

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

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

  • Recursos: Cuando realizas cambios de configuración, como la rotación de la 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.

El diagrama de estado en la documentación de la clase MediaPlayer aclara qué métodos mueven el MediaPlayer de un estado a otro. Por ejemplo:

  • Cuando creas un nuevo MediaPlayer, se encuentra en el estado Idle.
  • Para inicializarlo, llama asetDataSource(), lo que cambia su estado a Initialized.
  • Para prepararlo, usa el método prepare() o prepareAsync().
  • Cuando el objeto MediaPlayer termina de prepararse, ingresa al estado Prepared, lo que significa que puedes llamar a start() para que reproduzca el contenido multimedia.

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 retirar MediaPlayer

Un MediaPlayer puede consumir valiosos recursos 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 de usarlo, 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 conservarlo 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).

Desde ya, 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, piensa en 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 rota el dispositivo entre la orientación vertical y horizontal, ya que, en 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.

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