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();

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