Как узнать, закончен ли звук в Android? - PullRequest
6 голосов
/ 01 декабря 2010

Как узнать, закончился ли звук?

Я хочу воспроизвести 2 звука, но хочу воспроизвести один звук, а затем подождать, пока не закончится первый звук, прежде чем начнется второй.

Кроме того, если бы я хотел сделать что-то еще, когда звук закончился, как показать следующее представление в флипплере, могу ли я это сделать?

Сейчас я использую SoundPool для воспроизведения своих звуков.

Ответы [ 4 ]

3 голосов
/ 01 декабря 2010

Используйте класс MediaPlayer и OnCompletionListener

1 голос
/ 19 июня 2013

Просто идея ... получите продолжительность воспроизведения звука ogg / wav и используйте свой собственный класс SoundObject с элементом таймера. Обновите его в какой-нибудь функции обновления. Если таймер> максимальное время + порог, отметьте его как завершенный.

0 голосов
/ 10 апреля 2014

Извините, это слишком поздно, чтобы ответить. Но я использовал isPlaying () API из медиаплеера, чтобы дождаться завершения первой песни.

while(mediaPlyaer.isPlaying()){
}
0 голосов
/ 16 октября 2013

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

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

Вот обработчик

handler = new Handler() {

            /* (non-Javadoc)
             * @see android.os.Handler#handleMessage(android.os.Message)
             */
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == NEXT_ITEM_MSG) {
                    showNext();
                }
                else if (msg.what == SEQUENCE_COMPLETE_MSG) {
                    // notify the listener
                    if (animationCompleteListener != null) {
                        animationCompleteListener.onAnimationComplete();
                    }
                }
            }
        };

Метод showNext () просто захватывает следующий элемент в последовательности, обновляет изображениепросмотреть, воспроизвести звук, а затем назначить обработчику сообщение для вызова showNext после последовательности.

private void showNext() {
        if (mRunning) {
            // Get the first item
            AnimatedSequenceItem item = currentSequence.getNextSequenceItem();
            if (item == null) {
                Message msg = handler.obtainMessage(SEQUENCE_COMPLETE_MSG);
                handler.sendMessage(msg);
                return;
            }
            // Show the first image
            showImage(item.getImageResId());
            // Play the sound
            int iSoundResId = item.getSoundResId();
            if (iSoundResId != -1) {
                playSound(iSoundResId);
            }

            // schedule a message to advance to next item after duration
            Message msg = handler.obtainMessage(NEXT_ITEM_MSG);
            handler.sendMessageDelayed(msg, item.getDuration());
        }
    }

Конечно, все это требует от вас определения и жесткого кодирования задержек, но по моему опыту вынужно сделать это для игры в любом случае.У меня было много случаев, когда я хотел, чтобы задержка была длиннее звука.Вот код, который на самом деле ставит в очередь элементы.

battleSequence.addSequenceItem(R.drawable.brigands, 
                   R.raw.beep, 
                   2000);
battleSequence.addSequenceItem(R.drawable.black,
                               winning ? R.raw.enemy_hit : R.raw.player_hit, 
                               1500);

При таком подходе я могу использовать всевозможную логику для добавления элементов анимации, изменения длительности, анимации цикла и т. Д. Просто потребовалась небольшая настройкапонять задержки правильно.

Надеюсь, это поможет.

...