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

最佳答案

似乎问题出在单击停止按钮时,您在release()实例上调用了MediaPlayer,但是在(重新)开始播放时您没有检查它的状态。

这意味着您可以在已发布的isPlaying()实例上调用MediaPlayer,这将导致IllegalStateException

您应该以某种方式跟踪MediaPlayer实例的状态(例如,带有boolean标志),或者在发行后将其设置为null,以便可以在之后执行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();


// in your stop button's onClick()
mp.release();
mp = null; // set it to null

关于android - 无法播放声音两次,Android MediaPlayer应用程序崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37831680/

10-13 05:06