无法播放两次Android MediaPlayer应用程序崩溃的声音

时间:2016-06-15 09:39:44

标签: android audio

无法播放声音两次导致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

1 个答案:

答案 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();