Comienza a usar el Reproductor multimedia

En este documento, se presentan los conceptos básicos que debes conocer antes de trabajar con el Reproductor multimedia.

Clases de sonido y video

Las siguientes clases reproducen sonido y video en el framework de Android:

  • MediaPlayer: Esta clase es la API principal para reproducir sonido y video.
  • AudioManager: Esta clase administra las fuentes de audio y la salida de audio en un dispositivo.

Declaraciones del manifiesto

Antes de comenzar a desarrollar tu app con MediaPlayer, asegúrate de que el manifiesto contenga las declaraciones adecuadas para permitir el uso de funciones relacionadas.

  • Permiso de Internet: Si usas MediaPlayer para transmitir contenido basado en la red, tu app debe solicitar acceso a la red.

    <uses-permission android:name="android.permission.INTERNET" />
    
  • Permiso de bloqueo de activación: Si la app del reproductor debe evitar que la pantalla se oscurezca o que el procesador entre en suspensión, o si utiliza los métodos MediaPlayer.setScreenOnWhilePlaying(boolean) o MediaPlayer.setWakeMode(android.content.Context, int), debes solicitar este permiso.

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    

Cómo usar la clase MediaPlayer

La clase MediaPlayer es un componente esencial del framework de medios. Un objeto de esta clase puede recuperar, decodificar y reproducir audio y video con una configuración mínima. MediaPlayer admite varias fuentes de medios, como las siguientes:

  • Recursos locales
  • URI internos, como uno que se pueda obtener de un agente de resolución de contenido
  • URL externas (transmisión)

Para obtener una lista de los formatos de medios compatibles con Android, consulta la página Formatos de medios compatibles.

Ejemplos de trabajo con fuentes de audio

A continuación, se muestra un ejemplo de cómo reproducir un archivo de audio que está disponible como recurso local sin procesar (guardado en el directorio res/raw/ de tu app):

Kotlin

var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1)
mediaPlayer.start() // no need to call prepare(); create() does that for you

Java

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you

En este caso, un recurso "sin procesar" es un archivo que el sistema no intenta analizar de ninguna manera en particular. Sin embargo, el contenido de este recurso no debe ser audio sin formato. Debe ser un archivo multimedia con el formato y la codificación adecuados en uno de los formatos admitidos.

A continuación, se muestra cómo puedes reproducir desde un URI disponible de forma local en el sistema (que obtuviste mediante un agente de resolución de contenido, por ejemplo):

Kotlin

val myUri: Uri = .... // initialize Uri here
val mediaPlayer = MediaPlayer().apply {
    setAudioAttributes(
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()
    )
    setDataSource(applicationContext, myUri)
    prepare()
    start()
}

Java

Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();

La reproducción desde una URL remota con transmisión HTTP tiene el siguiente aspecto:

Kotlin

val url = "http://........" // your URL here
val mediaPlayer = MediaPlayer().apply {
    setAudioAttributes(
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()
    )
    setDataSource(url)
    prepare() // might take long! (for buffering, etc)
    start()
}

Java

String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();

Usa la preparación asíncrona para mejorar el rendimiento

Ten en cuenta el rendimiento cuando uses MediaPlayer. Por ejemplo, la ejecución de la llamada a prepare() puede tardar mucho tiempo, ya que puede implicar la obtención y decodificación de datos multimedia. Por lo tanto, como en el caso de cualquier método que pueda tardar mucho en ejecutarse, nunca debes llamarlo desde el subproceso de IU de tu app. Si lo haces, la IU dejará de responder hasta que se muestre el método, lo que constituye una experiencia del usuario deficiente y puede causar un error ANR (aplicación no responde).

Para evitar colgar el subproceso de IU, genera otro para preparar el MediaPlayer y notifica al subproceso principal cuando haya terminado. El framework proporciona una forma conveniente de realizar el método prepareAsync() para realizar esta tarea. Este método comienza a preparar los medios en segundo plano y los muestra de inmediato. Cuando termina la preparación de los medios, se llama al método onPrepared() de MediaPlayer.OnPreparedListener, que se configuró a través de setOnPreparedListener().

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: