无法播放声音两次导致Android MediaPlayer
应用程序崩溃
mp = MediaPlayer.create(context, R.raw.audio1);
final ImageButton play = (ImageButton) findViewById(R.id.play_button_dua_seher);
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
if (mp.isPlaying()) {
mp.stop();
mp.reset();
mp.release();
mp = MediaPlayer.create(context, R.raw.audio1);
}
mp.start();
} catch (Exception e) {
e.printStackTrace();
}
}
});
final ImageButton stop = (ImageButton) findViewById(R.id.stop_button_dua_seher);
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mp != null)
{
mp.stop();
mp.reset();
mp.release();
}
}
});
logcat的
06-15 14:34:59.470 11697-11697/com.toptech.android.ramadanduas
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.toptech.android.ramadanduas, PID: 11697
java.lang.IllegalStateException
at android.media.MediaPlayer.isPlaying(Native Method)
at com.toptech.android.ramadanduas.duaseher$2.onClick(duaseher.java:53)
at android.view.View.performClick(View.java:5697)
at android.view.View$PerformClick.run(View.java:22526)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit
答案 0 :(得分:0)
似乎问题是您在单击停止按钮时在release()
实例上调用MediaPlayer
,但在(重新)开始播放时您没有检查它的状态。
这意味着您可以在已发布的isPlaying()
个实例上调用MediaPlayer
,这将导致IllegalStateException
。
您应该以某种方式跟踪MediaPlayer
实例的状态(例如,使用boolean
标志)或在发布后将其设置为null
,以便您可以执行{{1之后的值检查。
你可以这样做:
null
和
// in your play button's onClick()
if (mp != null && mp.isPlaying()) { // check for null value also
mp.stop();
mp.reset();
} else {
mp = MediaPlayer.create(context, R.raw.audio1);
}
mp.start();