首页 > 解决方案 > 活动恢复后,Android MediaPlayer 类抛出 java.lang.IllegalStateException

问题描述

我试图在活动 onPause() 和 onResume() 方法中使用 MediaPlayer 暂停和恢复 VideoView,但在 onResume() 方法中 MediaPlayer 抛出 java.lang.IllegalStateException。我没有释放 MediaPlayer,但我认为 MediaPlayer 在活动暂停后自动释放。我应该如何处理?

private MediaPlayer mediaPlayer;

void prepareVideo() {
    videoView = new VideoView(context.getApplicationContext());
    String path = "android.resource://" + getPackageName() + "/" + 
    R.raw.my_video;
    videoView.setVideoPath(path);
}

videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mediaPlayer = mp;
        mediaPlayer.start();
    }
});

@Override
protected void onResume() {
    super.onResume();
    if (mediaPlayer != null) {
        mediaPlayer.start();
    }
}

@Override
protected void onPause() {
    if (mediaPlayer != null && mediaPlayer.isPlaying()) {
        mediaPlayer.pause();
    }
    super.onPause();
}

例外:

    Caused by: java.lang.IllegalStateException
    at android.media.MediaPlayer._start(Native Method)
    at android.media.MediaPlayer.start(MediaPlayer.java:1194)
    at co.myapp.app.reborn.myappTestActivity.onResume(myappTestActivity.java:370)
    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1259)
    at android.app.Activity.performResume(Activity.java:6347)
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3110)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3152) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1400) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5530) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:734) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) 

标签: androidandroid-mediaplayerandroid-videoview

解决方案


看一下android文档上的媒体播放器状态图

MediaPlayer 状态图

根据图表,您必须在调用 start() 之前调用 setDataSource() 和 prepare()。

可能之前发生了一些错误。您的 logcat 应该为您指明正确的方向。

我的猜测是您的媒体播放器不是处于暂停状态而是处于停止状态。所以你必须调用prepare然后开始,而不仅仅是开始。

不幸的是,这样您的播放将从头开始。

您可以使用 seek 命令恢复活动暂停期间保存的位置。


推荐阅读