Android MediaPlayer在停止后无法重新启动

5

我想播放声音。第一次可以正常播放,但是如果我停止它并想重新开始,什么都不会发生...有任何想法吗?

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();
        }
    }
});
2个回答

7
使用MediaPlayer时,您应该始终参考此处可见的状态更改图表:http://developer.android.com/reference/android/media/MediaPlayer.html
从图表中可以看出,在对MediaPlayer调用stop()后,它会进入Stopped状态,您需要再次调用prepare()将其移动到Prepared状态,然后才能调用play()。
请记住,准备可能需要很长时间,因此频繁这样做可能会导致用户体验差,特别是如果您是从主线程执行(UI将在MediaPlayer准备期间冻结)。如果您经常播放声音,则真正需要做的就是只准备一次,然后始终保持在Started、Paused或PlaybackCompleted状态。
谷歌开发者计划工程师Bruno Oliveira

好的,听起来不错。但是每次我重新开始播放声音之前都要进行prepare()操作,所以通常情况下应该可以工作。 - Liam Schnell
@Liam:你在发布的代码中没有一个。在你的onClick中,你需要在mp.start()之前调用mp.prepare()。否则,只需使用mp.pause()代替mp.stop(),当然要记住,这将继续上次的位置。 - Kevin Coppock

0

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


你的日志里有任何输出吗? - FoamyGuy
不,我正在我的真实手机上测试它,因为我的模拟器根本没有输出声音… - Liam Schnell
@Liam:在你的设备上调试时,仍然可以获取日志。 - Kevin Coppock
03-29 15:35:36.871:错误/媒体播放器(225):在状态64中调用了开始这是我第二次想要启动它时得到的信息!状态64告诉我MediaPlayer已经死亡...太好了:D - Liam Schnell
好的,你确实在try/catch中有你的prepare()方法,而且你的start()方法在它的外面。如果你的prepare()调用失败了,你的代码仍然会尝试启动。我建议把你的start()调用也放到try/catch块里面。 - Kevin Coppock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接