Android SoundPool: получать уведомление о завершении воспроизведения
Этот звук настолько прост, что я не могу понять, почему я не могу найти ответ lol
У меня есть рабочий класс пула звуков (благодаря учебнику и некоторой настройке, которую я сделал), и он отлично работает.
теперь проблема заключается в том, что я хочу, чтобы я случайно менял свою фоновую музыку. (не всегда имеют одну и ту же музыку в цикле, но имеют 2 или 3, а когда один заканчивается, я играю одну из двух других).
Проблема заключается в том, что я не могу найти способ получить уведомление о том, что музыка закончилась.
Любые идеи?
Джейсон
Ответы
Ответ 1
Это невозможно сделать с SoundPool, насколько я могу судить.
Единственный аудиопроигрыватель, который я знаю, который может предоставить уведомление о завершении
MediaPlayer - это скорее сложный зверь, чем SoundPool, но позволяет настроить уведомление OnCompletionListener, когда воспроизведение завершено.
Ответ 2
Это то, что я делаю:
В запуске Я получаю длину каждого звукового щелчка с помощью MediaPlayer:
private long getSoundDuration(int rawId){
MediaPlayer player = MediaPlayer.create(context, rawId);
int duration = player.getDuration();
return duration;
}
и сохранить звук вместе с длительностью вместе (в объекте типа DTO).
Ответ 3
У меня более 100 коротких звуковых клипов, а SoundPool - мой лучший вариант. Я хочу сыграть один клип сразу после того, как другой клип закончен. Обнаружив, что нет эквивалента onCompletionListener(), я решил реализовать runnable. Это работает для меня, потому что первый звук длится от 1 до 2 секунд, поэтому у меня есть продолжительность runnable set в 2000 году. Надеюсь, что они работают над этим классом, потому что у него много возможностей!
Ответ 4
MediaPlayer тяжелый и медленный по сравнению с SoundPool, но SoundPool не имеет setOnCompletionListener. Чтобы справиться с этой проблемой, я внедрил настраиваемый класс из SoundPool с помощью setOnCompletionListener.
: похожее на MediaPlayer
Создание:
SoundPoolPlayer mPlayer = SoundPoolPlayer.create(context, resId);
mPlayer.setOnCompletionListener(
new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) { //mp will be null here
Log.d("debug", "completed");
}
};
);
mPlayer.play();
пауза:
mPlayer.pause();
остановка:
mPlayer.stop();
резюме:
mPlayer.resume();
isPlaying:
mPlayer.isPlaying();
любой запрос на тягу приветствуется. Я только реализовал то, что мне нужно здесь.