Começar a usar o Media Player

Este documento apresenta os conceitos básicos que você precisa conhecer antes de trabalhar com o Media Player.

Classes de áudio e vídeo

As classes a seguir reproduzem som e vídeo no framework do Android:

  • MediaPlayer: essa classe é a principal API para reprodução de som e vídeo.
  • AudioManager: essa classe gerencia fontes de áudio e saída de áudio em um dispositivo.

Declarações do manifesto

Antes de iniciar o desenvolvimento no seu aplicativo usando o MediaPlayer, verifique se o manifesto tem as declarações adequadas para permitir o uso de recursos relacionados.

  • Permissão de Internet:se você estiver usando o MediaPlayer para fazer streaming de conteúdo on-line, seu aplicativo precisará solicitar acesso à rede.

    <uses-permission android:name="android.permission.INTERNET" />
    
  • Permissão de wake lock:se o aplicativo precisar impedir que a tela seja escurecida ou que o processador entre em suspensão, ou se ele usar os métodos MediaPlayer.setScreenOnWhilePlaying(boolean) ou MediaPlayer.setWakeMode(android.content.Context, int), será necessário solicitar esta permissão.

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

Usar a classe MediaPlayer

A classe MediaPlayer é um componente essencial do framework de mídia. Um objeto dessa classe pode buscar, decodificar e reproduzir áudio e vídeo com uma configuração mínima. O MediaPlayer oferece suporte a várias fontes de mídia, incluindo:

  • Recursos locais
  • URIs internos, como um que você possa conseguir a partir de um resolvedor de conteúdo
  • URLs externos (streaming)

Para conferir uma lista de formatos de mídia compatíveis com o Android, consulte a página Formatos de mídia compatíveis.

Exemplos de como trabalhar com fontes de áudio

Confira um exemplo de como reproduzir o áudio disponível como um recurso bruto local (salvo no diretório res/raw/ do aplicativo):

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

Nesse caso, um recurso "bruto" é um arquivo que o sistema não tenta analisar de nenhuma maneira específica. No entanto, o conteúdo desse recurso não deve ser áudio bruto. Ele precisa ser um arquivo de mídia corretamente codificado e formatado em um dos formatos compatíveis.

Confira como você pode reproduzir a partir de um URI disponível localmente no sistema (que você obteve por um resolvedor de conteúdo, por exemplo):

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();

A reprodução a partir de um URL remoto usando streaming HTTP é assim:

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();

Usar a preparação assíncrona para melhorar o desempenho

Considere a performance ao usar MediaPlayer. Por exemplo, a chamada para prepare() pode levar muito tempo para ser executada, porque pode envolver a busca e a decodificação de dados de mídia. Portanto, como qualquer método que possa levar muito tempo para ser executado, nunca o chame na linha de execução de IU do aplicativo. Isso faz com que a interface pare de responder até que o método retorne, o que é uma experiência ruim para o usuário e pode causar um erro ANR (o app não está respondendo).

Para evitar a interrupção da linha de execução de IU, gere outra linha de execução para preparar o MediaPlayer e notifique a linha principal quando terminar. O framework oferece uma maneira conveniente de realizar o método prepareAsync() para fazer essa tarefa. Esse método começa a preparar a mídia em segundo plano e retorna imediatamente. Quando a mídia é preparada, o método onPrepared() do MediaPlayer.OnPreparedListener, configurado por setOnPreparedListener(), é chamado.

Saiba mais

O Jetpack Media3 é a solução recomendada para a reprodução de mídia no seu app. Saiba mais.

Estas páginas abrangem tópicos relacionados à gravação, ao armazenamento e à reprodução de áudio e vídeo: