Começar a usar o Media Player

Este documento apresenta os conceitos básicos que você precisa conhecer antes de trabalhar com o player de mídia.

Classes de som e vídeo

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

  • MediaPlayer: essa classe é a API principal para reproduzir 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 apropriadas 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 seu aplicativo precisar impedir que a tela seja escurecida ou que o processador entre em suspensão, ou se ele usar os MediaPlayer.setScreenOnWhilePlaying(boolean) ou MediaPlayer.setWakeMode(android.content.Context, int) métodos, 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 quantidade mínima de configuração. 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 ver 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

Veja 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 pode ser áudio bruto. Ele deve ser um arquivo de mídia corretamente codificado e formatado em um dos formatos compatíveis.

Veja como você pode reproduzir a partir de um URI disponível localmente no sistema (acessado por meio de 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 a performance

Mantenha a performance em mente 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, assim como qualquer método que possa demorar muito tempo a executar, nunca o chame na linha de execução de interface do utilizador da aplicação. 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 interface, 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 prepareAsync() método para fazer esta tarefa. Esse método começa a preparar a mídia em segundo plano e retorna imediatamente. Quando a mídia termina de ser preparada, o onPrepared() método do MediaPlayer.OnPreparedListener, configurado por setOnPreparedListener(), é chamado.

Saiba mais

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

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