Как воспроизвести mp3 в папке res/raw моего приложения для Android?
У меня есть небольшой (200kb) mp3 в папке res/raw моего приложения для Android. Я пытаюсь запустить его в эмуляторе от Eclipse. Он распознается как ресурс в файле R, но когда я пытаюсь подготовить/запустить, моя активность падает! Было ли что-то еще, что мне нужно было изменить, возможно, в манифесте?
MediaPlayer mPlayer = MediaPlayer.create(FakeCallScreen.this, R.raw.mysoundfile);
try {
mPlayer.prepare();
mPlayer.start();
} catch (IOException e) {
// handle this later
}
Ответы
Ответ 1
При запуске действия i.e on onCreate введите следующий код.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MediaPlayer mPlayer = MediaPlayer.create(FakeCallScreen.this, R.raw.mysoundfile);
mPlayer.start();
}
При остановке активности, то есть on onDestroy, поставьте следующий код.
public void onDestroy() {
mPlayer.stop();
super.onDestroy();
}
Надеюсь, это поможет:)
Ответ 2
Вероятно, вы предпочитаете использовать класс SoundPool. Это уменьшает задержку при воспроизведении звука и предлагает другие тонкости, такие как возможность приоритизировать звуки, когда слишком много для воспроизведения сразу.
Из документов:
SoundPool - это набор образцов, которые могут быть загружены в память из ресурса внутри APK или из файла в файловой системе. Библиотека SoundPool использует службу MediaPlayer для декодирования аудио в необработанный 16-битный моно или стерео поток PCM. Это позволяет приложениям поставлять сжатые потоки, не испытывая нагрузки процессора и задержки при распаковке во время воспроизведения.
Например:
/**
* How many sounds can be played at once.
*/
private static final int MAX_SOUND_POOL_STREAMS = 4;
/**
* Modify this as part of your own priority scheme. Higher numbers mean higher
* priority. If you don't care, it okay to use the same priority for every
* sound.
*/
private static final int NORMAL_PRIORITY = 10;
private int mySoundId;
@Override
public void setupContent() {
this.soundPool = new SoundPool(MAX_SOUND_POOL_STREAMS,
AudioManager.STREAM_MUSIC, 100);
this.mySoundId = this.soundPool.load(this.getApplicationContext(),
R.raw.mySound, 1);
}
@Override
private void playMySound() {
this.soundPool.play(this.mySoundId, 1, 1, NORMAL_PRIORITY, 0, 1);
}
Ответ 3
Это статический метод, который я использую в своих проектах.
Я добавляю его в класс Utils:
public static void playSound(final Context context, final SoundType type)
{
new Thread(new Runnable()
{
@Override
public void run()
{
MediaPlayer mediaPlayer = new MediaPlayer();
int resId = -1;
switch (type)
{
case INCOMING_NOTIFICATION:
resId=R.raw.noti_sound;
break;
case SEND_BETTING_SLIP:
resId=R.raw.slip_sent;
break;
case TRIVIA_RIGHT_ANSWER:
resId=R.raw.game_bonus;
break;
case TRIVIA_WRONG_ANSWER:
resId=R.raw.whistle_referee_trivia_bad_answer;
break;
}
if (resId != -1)
{
mediaPlayer = MediaPlayer.create(context, resId);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setLooping(false);
mediaPlayer.start();
while (mediaPlayer.isPlaying() == true)
{
}
}
}
}).start();
}
}
теперь я перепутаю Enum (SoundType) и поместил mp3 файлы в необработанную папку в
res.