如何知道在Android中播放声音是否完成?

问题描述:

如何知道声音是否已完成播放?如何知道在Android中播放声音是否完成?

我想播放2个声音,但我想播放一个声音,然后等到第2个声音在第2个开始之前完成。

另外,如果我想在声音完成时做其他事情,比如显示他在视图中的下一个视图,那么我可以这样做吗?

现在我正在使用SoundPool来播放我的声音。

使用MediaPlayer类和OnCompletionListener

+3

有没有办法用SoundPool做到这一点?我需要SoundPool的低延迟。 – cmerrell 2010-11-30 23:56:47

只是一个想法...获取OGG/WAV声音播放时间长度和使用自己的SoundObject类计时器成员。 在某些更新功能中更新它。 如果timer> maxtime + threshold,则将其标记为已完成。

我解决这个问题的方法是创建一个包含图像,声音和延迟的动画序列。然后,我可以将这些排队,这样我就可以显示图像,并伴随声音,然后切换到另一个图像。我用SoundPlayer和一个自定义视图来做这件事(不是视图脚蹼,虽然你可能可以)

诀窍是,你不能简单地暂停线程的延迟,你需要使用一个处理程序发送一条消息以便将来更新UI。

这里是处理器

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

采用这种方法,我可以有各种逻辑来添加动画项目,改变持续时间,循环动画等..它只是采取了一些微调,以获得拖延的权利。

希望这会有所帮助。

对不起,这是为时已晚。但我用mediaplayer的isPlaying()API来等待第一首歌曲完成。

while(mediaPlyaer.isPlaying()){ 
}