MediaPlayer: проигрывание звука Печать
Добавил(а) microsin   

При создании приложения Android часто необходимо проигрывать звук при наступлении разных событий. Это можно сделать несколькими способами: с помощью классов MediaPlayer [2], AudioTrack [3] или SoundPool [4]. В этой статье рассмотрено использование класса MediaPlayer для проигрывания звука, сохраненного в ресурсах приложения (среда разработки Eclipse).

1. Раскройте в Package Explorer дерево проекта, и добавьте в папку res подпапку raw. Эта папка предназначена для хранения различных ресурсов, в том числе и аудио.

2. Перетаскиванием положите в папку raw аудиофайл (формата wav или mp3). На запрос "копировать или создать ярлык?" выберите копирование. После копирования сделайте операцию очистки Project -> Clean... (при этом в файле R.java автоматически создастся цифровой идентификатор ресурса, привязанный к аудиофайлу).

Внимание: имя файла не должно содержать заглавные буквы и пробелы, и должно начинаться с буквы.

3. Добавьте код, который будет запускать проигрывание файла в нужный момент времени. Это может быть код события клика на кнопке.

public void ButtonClick(View v)
{
   //Объект проигрывателя, который будет проигрывать звук на кнопке.
   MediaPlayer mp = MediaPlayer.create(this, R.raw.girlfart01);
   //Звук будет проигрываться только 1 раз:
   mp.setLooping(false);
   //Установка обработчика события на момент готовности проигрывателя:
   mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener()
   {
      public void onPrepared(MediaPlayer mp)
      {
         //При готовности к проигрыванию запуск вывода звука:
         mp.start();
      }
   });
}

Это еще не все. После окончания проигрывания нужно освободить ресурс медиаплеера, иначе через десяток-другой проигрывания звук перестанет воспроизводиться, и объект медиаплеера начнет возвращать ошибку:

...
04-18 21:12:17.043: V/MediaPlayer(9815): start
04-18 21:12:17.058: V/MediaPlayer(9815): message received msg=100, ext1=-19, ext2=0
04-18 21:12:17.058: E/MediaPlayer(9815): error (-19, 0)
04-18 21:12:17.058: V/MediaPlayer(9815): callback application
04-18 21:12:17.058: V/MediaPlayer(9815): back from callback
04-18 21:12:17.063: E/MediaPlayer(9815): Error (-19,0)
04-18 21:12:17.098: V/MediaPlayer(9815): message received msg=2, ext1=0, ext2=0
04-18 21:12:17.098: V/MediaPlayer(9815): playback complete
04-18 21:12:17.098: V/MediaPlayer(9815): callback application
04-18 21:12:17.098: V/MediaPlayer(9815): back from callback
...

Чтобы этого не произошло, нужно добавить обработчик события медиаплеера, срабатывающее при завершении проигрывания. В этом обработчике нужно освобождать ресурс медиаплеера:

mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener()
{
    public void onCompletion(MediaPlayer mp)
    {
        mp.release();
    }
});

Полностью проект с примером воспроизведения звука можно скачать по ссылке [5].

[Ссылки]

1. Media Playback site:developer.android.com.
2. MediaPlayer site:developer.android.com.
3. AudioTrack site:developer.android.com.
4. SoundPool site:developer.android.com.
5. 140324animbutton-android-MediaPlayer.zip - проект Eclipse, демонстрирующий воспроизведение звука с помощью класса MediaPlayer.