[英]MediaPlayer or SoundPool for multiple short sounds?
該應用程序基本上允許用戶在單擊各種項目時播放動物聲音,語音或其他聲音。 我試圖找出是否以正確的方式執行此操作,因為當用戶靜音>取消靜音>播放聲音時,我遇到了類似此錯誤的問題:
java.lang.IllegalStateException at android.media.MediaPlayer.isPlaying(Native Method)
public class GuessActivity extends Activity implements PopupMenu.OnMenuItemClickListener {
public static int[] ssSoundsArray = {R.raw.sbuffalo, R.raw.scamel, R.raw.scat, R.raw.schicken};
public static int[] ssVoicesArray = {R.raw.buffalo, R.raw.camel, R.raw.cat, R.raw.chicken};
MediaPlayer mMediaPlayer;
Context context;
...
}
這是我如何使用MediaPlayer的示例:
if(audio_all) {
if(mMediaPlayer != null) {
if(mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
mMediaPlayer.release();
}
}
mMediaPlayer = MediaPlayer.create(this, R.raw.whatever);
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mediaPlayer) {
mMediaPlayer.release();
mMediaPlayer = null;
}
});
}
我對不同的按鈕等做了多次,請確保它們完成后釋放(),因為我之前遇到過內存問題。 所以上面的異常告訴我isPlaying()
無效,因為MediaPlayer
不存在,但由於某種原因,它忽略了if(mMediaPlayer != null)
如果正在播放任何內容,則必須停止播放,因為用戶可以隨意單擊,並且我當然不希望任何聲音相互疊加。
用戶靜音的方法如下:
case R.id.action_toggle_sounds:
if(audio_all) {
if(mMediaPlayer != null) {
if(mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
mMediaPlayer.release();
}
}
Toast.makeText(this,"All sounds disabled",Toast.LENGTH_LONG).show();
audio_all = false;
} else {
Toast.makeText(this,"All sounds enabled",Toast.LENGTH_LONG).show();
audio_all = true;
}
return true;
我非常感謝您對此提供的任何幫助,非常感謝!
如果沒有太多曲目要播放(不超過32條),則可以嘗試初始化多個MediaPlayer
實例,然后僅在調用app onPause()/ onStop()時釋放它們。 然后,您將可以使用MediaPlayer's
池。 您只需要記住當前正在使用哪一個即可。
同樣,如果您在多個線程(不僅是UI線程)中使用MediaPlayer,則必須使用互斥(線程阻塞)以避免問題。
基於MediaPlayer的狀態機-IllegalStateException基本上意味着,不允許調用isPlaying()
時,播放器實例處於狀態。 對於記錄的isPlaying()
不允許的狀態僅為Error
狀態,但是在調用release()
之后假定狀態可能也不適合此狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.