Neste tutorial você irá aprender a trabalhar com o MediaPlayer do Android para executar arquivos de áudio.

Iremos construir um simples aplicativo para reproduzir sons de animais. A ideia é que ao clicar no nome de um determinado animal o som característico dele seja reproduzido.

Ao terminarmos o aplicativo ele ficará com esta aparência:

Tutorial Android MediaPlayer

Criando o projeto no Android Studio

Antes de mais nada vamos criar o nosso projeto no Android Studio.

Abra o seu Android Studio e clique em “Start a new Android Studio project”.

Criar um novo projeto no Android Studio

Escolha um nome para o seu projeto. Eu escolhi o nome “Tutorial MediaPlayer”.

Configurar projeto no Android Studio

Agora vamos definir a versão mínima para o qual o nosso projeto pretende dar suporte. Eu defini a API 9 (Android 2.3 – Gingerbread).

Definir a API de suporte mínima no Android Studio

Agora vamos criar uma activity para o nosso projeto. Escolha uma “Blank Activity”.

Criar nova activity no Android Studio

Na próxima tela mantenha o nome padrão da activty, no caso “MainActivity”.

Nomeando activity no Android Studio

Pronto, o nosso projeto está criado!

Criando a interface de usuário

Agora que o nosso projeto já está criado, vamos criar a nossa interface de usuário.

Antes de mais nada, vamos definir os textos das strings que iremos utilizar em nossa interface. Para isso abra o arquivo strings.xml localizado na pasta res/xml e adicione as seguintes linhas:

<string name="animal_dog">Cachorro</string>
<string name="animal_cat">Gato</string>
<string name="animal_horse">Cavalo</string>
<string name="animal_cow">Vaca</string>
<string name="animal_pig">Porco</string>
<string name="animal_rooster">Galo</string>
<string name="animal_lion">Leão</string>
<string name="animal_turkey">Peru</string>

Agora abra o arquivo activity_main.xml, localizado na pasta res/layout.

Iremos utilizar um layout do tipo LinearLayout com a orientação vertical. Desta forma, cada elemento que for adicionado (neste caso, botões) será posicionado logo abaixo do anterior.

Vamos adicionar 8 botões, um para cada animal.

Nosso arquivo activity_main.xml ficará assim:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/animal_dog"
        android:id="@+id/btnDog" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/animal_cat"
        android:id="@+id/btnCat" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/animal_horse"
        android:id="@+id/btnHorse" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/animal_cow"
        android:id="@+id/btnCow" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/animal_pig"
        android:id="@+id/btnPig" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/animal_rooster"
        android:id="@+id/btnRooster" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/animal_lion"
        android:id="@+id/btnLion" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/animal_turkey"
        android:id="@+id/btnTurkey" />
</LinearLayout>

Adicionado os arquivos de áudio

Agora vamos adicionar os 8 arquivos de áudio, cada um com o som de um animal. Os arquivos estão em formato WAV e foram pegos na internet, a maioria do site http://soundbible.com/.

Crie uma pasta chamada raw dentro da pasta res. É nesta pasta que iremos armazenar os arquivos de áudio.

Os arquivos de áudio estão disponíveis neste link, baixe um por um e adicione na pasta res/raw do seu projeto.

Arquivos de Áudio

Trabalhando com o MediaPlayer

Agora que já criamos a nossa interface do usuário e adicionamos os arquivos de áudio necessários para nossa aplicação, vamos finalmente trabalhar com o MediaPlayer em nossa activity principal.

Abra o arquivo MainActivity e defina uma variável do tipo Button para cada botão:

private Button btnDog;
private Button btnCat;
private Button btnHorse;
private Button btnCow;
private Button btnPig;
private Button btnRooster;
private Button btnLion;
private Button btnTurkey;

Crie também uma variável to tipo MediaPlayer:

private MediaPlayer mp;

Agora vamos implementar a interface View.OnClickListener para podermos capturar os eventos de clique nos botões.

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

Agora no nosso método onCreate iremos instanciar as variáveis mp e dos botões e setar o listener do evento OnClick.

Nosso método onCreate ficará assim:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mp = new MediaPlayer();
    mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });

    btnDog = (Button) findViewById(R.id.btnDog);
    btnCat = (Button) findViewById(R.id.btnCat);
    btnHorse = (Button) findViewById(R.id.btnHorse);
    btnCow = (Button) findViewById(R.id.btnCow);
    btnPig = (Button) findViewById(R.id.btnPig);
    btnRooster = (Button) findViewById(R.id.btnRooster);
    btnLion = (Button) findViewById(R.id.btnLion);
    btnTurkey = (Button) findViewById(R.id.btnTurkey);

    btnDog.setOnClickListener(this);
    btnCat.setOnClickListener(this);
    btnHorse.setOnClickListener(this);
    btnCow.setOnClickListener(this);
    btnPig.setOnClickListener(this);
    btnRooster.setOnClickListener(this);
    btnLion.setOnClickListener(this);
    btnTurkey.setOnClickListener(this);
}

No método onClick , que é disparado quando cada um dos botões forem clicados, iremos verificar qual dos botões foi clicado e setar o áudio referente a este botão. Para isso usamos o método setDataSource da classe MediaPlayer.

Antes disso iremos verificar se o player já não está tocando, ou seja, se algum botão já não foi clicado e o áudio ainda está rodando. Se ele estiver tocando iremos pará-lo antes de executá-lo novamente. Para isso, usamos o método isPlaying para saber se o player está tocando e o método stop para pará-lo.

Nosso método onClick ficará assim:

@Override
public void onClick(View v) {
    try {
        if (mp.isPlaying()) {
            mp.stop();
        }
        mp.reset();
        AssetFileDescriptor afd = null;
        switch (v.getId()) {
            case R.id.btnDog:
                afd = getResources().openRawResourceFd(R.raw.dog);
                break;
            case R.id.btnCat:
                afd = getResources().openRawResourceFd(R.raw.cat);
                break;
            case R.id.btnHorse:
                afd = getResources().openRawResourceFd(R.raw.horse);
                break;
            case R.id.btnCow:
                afd = getResources().openRawResourceFd(R.raw.cow);
                break;
            case R.id.btnPig:
                afd = getResources().openRawResourceFd(R.raw.pig);
                break;
            case R.id.btnRooster:
                afd = getResources().openRawResourceFd(R.raw.rooster);
                break;
            case R.id.btnLion:
                afd = getResources().openRawResourceFd(R.raw.lion);
                break;
            case R.id.btnTurkey:
                afd = getResources().openRawResourceFd(R.raw.turkey);
                break;
        }
        if (afd != null) {
            mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            mp.prepareAsync();
        }
    } catch (IOException e) {
        Log.e("", e.getMessage());
    }
}

Para que não ocorra nenhum travamento durante a reprodução do áudio, iremos executar o player de forma assíncrona. Para fazermos isso usando o MediaPlayer é muito simples, chamamos o método prepareAsync e só executamos o método play (tocar) quando o método setOnPreparedListener for chamado.

Por fim, quando fecharmos o aplicativo, devemos verificar se o player está tocando e, caso esteja, devemos pará-lo. Para isso vamos sobrescrever o método onStop da activity e usar os métodos isPlaying e stop:

@Override
protected void onStop() {
    super.onStop();
    if (mp.isPlaying()) {
        mp.stop();
    }
    mp.release();
}

O arquivo MainActivity completo pode ser visto aqui.

O projeto completo pode ser visto e baixado no Github: https://github.com/LeonardoTeixeira/tutorial-android-mediaplayer