簡體   English   中英

我怎么知道聲音是否在Android中播放完畢?

[英]How do I know if a sound is finished playing in android?

我怎么知道聲音是否播放完畢?

我想播放2種聲音,但我想要播放一種聲音,然后等到第一次聲音在第二次開始之前完成。

另外,如果我想在聲音結束時做其他事情,比如在視圖鰭狀肢中顯示他的下一個視圖,我可以這樣做嗎?

現在我正在使用SoundPool播放我的聲音。

使用MediaPlayer類和OnCompletionListener

只是一個想法...獲取ogg / wav聲音播放時間長度並使用自己的SoundObject類與計時器成員。 在某些更新功能中更新它。 如果timer> maxtime + threshold,則將其標記為已完成。

我解決這個問題的方法是創建一個包含圖像,聲音和延遲的動畫序列。 然后,我可以將它們排隊,這樣我就可以顯示圖像,並伴隨聲音,然后切換到另一個圖像。 我使用SoundPlayer和自定義視圖(不是視圖鰭狀肢,盡管你可能)

訣竅是你不能簡單地暫停線程延遲,你需要使用處理程序向自己發送一條消息,以便將來更新UI。

這是Handler

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()){
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM