Android MediaPlayer在停止后不会再次启动

时间:2011-03-29 14:50:35

标签: 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(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 个答案:

答案 0 :(得分:6)

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

http://developer.android.com/reference/android/media/MediaPlayer.html

从图中可以看出,在MediaPlayer上调用stop()后,它会进入Stopped状态,你需要再次调用prepare()将其调用Prepared状态,然后再调用play()。

请记住,准备工作可能需要很长时间,因此一直这样做可能会导致糟糕的用户体验,尤其是当您从主线程执行此操作时(UI将在MediaPlayer准备时冻结)。如果你经常播放声音,你应该只准备一次(),然后始终保持在Started,Paused或PlaybackCompleted状态。

Bruno Oliveira,Google开发人员程序工程师

答案 1 :(得分:0)

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