Android MediaPlayer停止后不会再次启动

Android MediaPlayer停止后不会再次启动,android,audio,media-player,Android,Audio,Media Player,我想放一个声音。第一次它运行良好,但如果我停止它并想重新启动它,什么都不会发生……你知道吗 final MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sex); ImageButton andvib = (ImageButton)findViewById(R.id.vib_toggle); final AudioManager am = (AudioManager)getSystemService(Conte

我想放一个声音。第一次它运行良好,但如果我停止它并想重新启动它,什么都不会发生……你知道吗

final MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sex);
ImageButton andvib = (ImageButton)findViewById(R.id.vib_toggle);
final AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
andvib.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {
        am.setStreamVolume(AudioManager.STREAM_MUSIC, vol, 0);
        Vibrator vibr = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
        vibr.cancel();
        if(vibrating==false) {
            if(style == 0)
                vibr.vibrate(durat, 0);
            if(style == 1){
                vibr.vibrate(staccato, 0);
            }
            if(style == 2){
                vibr.vibrate(wild, 0);
            }
            try {
                mp.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            mp.start();
            mp.setLooping(true);
            vibrating = true;
        }
        else {
            vibrating = false;
            mp.stop();
            try {
                mp.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            vibr.cancel();
        }
    }
});

在第二次调用
start()
之前,您可能需要调用
mp.prepare()

使用MediaPlayer时,您应该始终参考您可以在此处看到的状态更改图:

从图中可以看出,在MediaPlayer上调用stop()后,它将进入Stopped状态,您需要再次调用prepare(),以便在调用play()之前将其移动到Prepared状态

请记住,准备可能需要很长时间,因此一直这样做可能会导致糟糕的用户体验,特别是如果您是从主线程进行准备的话(当MediaPlayer准备时,UI将冻结)。如果您经常播放声音,您应该只准备一次,然后始终将其保持在开始、暂停或播放完成状态


布鲁诺·奥利维拉,谷歌开发者程序工程师,你的日志中有什么输出吗?没有,我正在我的真实手机上测试它,因为我的eumlator根本不输出声音…@Liam:在你的设备上调试时,你仍然可以得到日志。03-29 15:35:36.871:ERROR/MediaPlayer(225):在状态64中调用start这是我第二次想要启动它时得到的!状态64告诉我MediaPlayer已经死了……好吧,太好了:停下来,你的prepare()在try/catch中,而你的开始在try/catch之外。如果prepare()调用失败,代码仍将尝试启动。我会把start()调用也放在try/catch块中。好的,听起来不错。但是每次我再次启动声音时,我都会有一个prepare(),所以通常它应该可以工作。@Liam:你发布的代码中没有。在onClick中,需要在mp.start()之前调用mp.prepare()。否则,只需使用mp.pause()而不是mp.stop(),当然要记住,这将在结束时继续进行。