Java MediaPlayer或SoundPool支持多个短声音?
该应用程序基本上允许用户在单击各种项目时播放动物声音、声音或其他声音。我正在试图弄清楚我是否以正确的方式执行此操作,因为当用户静音>取消静音>播放声音时,我看到了类似此错误的一些问题:Java MediaPlayer或SoundPool支持多个短声音?,java,android,android-mediaplayer,soundpool,Java,Android,Android Mediaplayer,Soundpool,该应用程序基本上允许用户在单击各种项目时播放动物声音、声音或其他声音。我正在试图弄清楚我是否以正确的方式执行此操作,因为当用户静音>取消静音>播放声音时,我看到了类似此错误的一些问题: java.lang.IllegalStateException位于 android.media.MediaPlayer.isplay(本机方法) 以下是我如何使用MediaPlayer的示例: if(audio_all) { if(mMediaPlayer != null) {
java.lang.IllegalStateException位于
android.media.MediaPlayer.isplay(本机方法)
以下是我如何使用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;
}
});
}
我为不同的按钮等多次这样做,确保在完成后释放(),因为我以前遇到过mem问题。因此,上面的异常告诉我,isplay()
无效,因为MediaPlayer
不存在,但由于某种原因,如果(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的池。你只需要记住哪一个正在使用
另外,如果您在多个线程(不仅仅是UI线程)中使用MediaPlayer,则必须使用互斥(线程阻塞)来避免问题
基于MediaPlayer的状态机-IllegalStateException基本上意味着调用isplay()
不允许时播放器实例处于状态。对于isplay()
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;