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