2013-12-14 64 views
1

這個問題的類似問題很多,我已經看過其他答案。他們說的是,爲了播放聲音(在這種情況下,「tock.wav」,它位於assets文件夾),只要點擊一個按鈕,你應該做到以下幾點:按鈕聲音MediaPlayer崩潰如果按鈕太快按

public void onClick(View button) { 
    playButtonClickSound(); 
} 

private void playButtonClickSound() { 
    if (mMediaPlayer.isPlaying()) { 
     mMediaPlayer.stop(); 
     mMediaPlayer.reset(); 
    } 

    try { 
     AssetFileDescriptor afd; 
     afd = getAssets().openFd("tock.wav"); 
     mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
     mMediaPlayer.prepare(); 
     mMediaPlayer.start(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

這理解正確嗎?這似乎是一個好方法。事情是這樣的,除非用戶非常快速地按下按鈕(s)。然後在某個時候,聲音停止播放。如果您等待幾分鐘再試一次,它會再次播放。當然這不是我想要的。按鈕點擊聲音應該始終有效,而不僅僅是用戶沒有點擊太快。

那麼,有沒有人有一個想法,究竟是什麼造成了這種情況?

+0

禁用按鈕的onClick() – Carbon

+0

你是什麼意思呢? – Zero

+0

@零我會建議兩件事。 1)刪除'if'塊,只需調用'mMediaPlayer.reset()'。任何時候都應該合法,並且阻止球員作爲副作用。 2)獲得點擊處理程序之外的文件描述符。訪問該文件可能是該方法的瓶頸。 - 如果這不起作用,我有另一種可能的解決方案。 – Dave

回答

1

嘗試使用此

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1); 
mediaPlayer.start(); // no need to call prepare(); create() does that for you 
+0

這就是我之前做的,同樣的問題.. – Zero

+0

你想每次用戶點擊時播放聲音嗎?或者你想先完成當前的聲音,然後播放下一個聲音,無論用戶點擊 –