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)ouMediaPlayer.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: