Android SoundPool: получать уведомления о завершении игры - PullRequest
17 голосов
/ 14 декабря 2010

Это звучит так просто, что я не могу понять, почему я не могу найти ответ lol

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

проблема сейчас в том, что я хочу иметь возможность произвольно менять фоновую музыку. (не всегда одна и та же музыка в цикле, но есть 2 или 3, и когда один заканчивает, я играю одну из 2 других).

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

Есть идеи?

Jason

Ответы [ 4 ]

15 голосов
/ 29 февраля 2012

Вот что я делаю:

Вкл. запуск Я получаю длину каждого щелчка звука с помощью MediaPlayer:

private long getSoundDuration(int rawId){
   MediaPlayer player = MediaPlayer.create(context, rawId);
   int duration = player.getDuration();
   return duration;
}

и сохраните звук плюс длительность вместе (в объекте типа DTO).

12 голосов
/ 14 декабря 2010

Насколько я могу судить, это невозможно сделать с помощью SoundPool.

Единственный известный мне аудиопроигрыватель, который может предоставить уведомление о завершении, MediaPlayer - это более сложный зверь, чем SoundPool, но позволяет настроить OnCompletionListener для уведомления о завершении воспроизведения.

5 голосов
/ 22 августа 2013

У меня более 100 коротких аудиоклипов, и SoundPool - мой лучший вариант. Я хочу воспроизвести один клип сразу после окончания воспроизведения другого. Обнаружив, что нет эквивалента onCompletionListener (), я решил реализовать исполняемый файл. Это работает для меня, потому что первый звук длится от 1 до 2 секунд, поэтому у меня есть продолжительность запуска, установленного на 2000. Надеюсь, они работают на этом классе, потому что у него есть большой потенциал!

3 голосов
/ 11 марта 2016

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

stop:

mPlayer.stop();

резюме:

mPlayer.resume();

isPlaying:

mPlayer.isPlaying();

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

...