【问题标题】:Android MediaPlayer does not start again after being stoppedAndroid MediaPlayer 停止后无法重新启动
【发布时间】:2011-03-29 14:50:35
【问题描述】:

我想播放声音。第一次运行良好,但如果我停止它并想重新启动它,什么也没有发生......有什么想法吗?

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();
        }
    }
});

【问题讨论】:

    标签: android audio media-player


    【解决方案1】:

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

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

    从图中可以看出,MediaPlayer 调用 stop() 后进入 Stopped 状态,在调用 play() 之前,需要再次调用 prepare() 使其进入 Prepared 状态。

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

    Bruno Oliveira,Google 开发人员项目工程师

    【讨论】:

    • 好的,听起来不错。但是每次我再次启动声音之前我都有一个 prepare() ,所以通常它应该可以工作。
    • @Liam:您发布的代码中没有。在您的 onClick 中,您需要在 mp.start() 之前调用 mp.prepare()。否则,只需使用 mp.pause() 而不是 mp.stop(),当然请记住,这将在它停止的地方继续。
    【解决方案2】:

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

    【讨论】:

    • 您的日志中是否有任何输出?
    • 不,我正在我的真手机上测试它,因为我的 eumlator 根本不输出声音......
    • @Liam:在您的设备上调试时,您仍然可以获得日志。
    • 03-29 15:35:36.871: ERROR/MediaPlayer(225): start call in state 64 这是我第二次想要启动它时得到的结果!状态 64 告诉我 MediaPlayer 已经死了……嗯,太好了:D
    • 好吧,你的 prepare() 在 try/catch 中,而你的 start 在它之外。如果您的 prepare() 调用失败,您的代码仍将尝试启动。我也会把你的 start() 调用放在 try/catch 块中。
    猜你喜欢
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    相关资源
    最近更新 更多