Android MediaPlayer类在活动恢复后抛出java.lang.IllegalStateException异常

0qx6xfy6  于 2023-01-19  发布在  Android
关注(0)|答案(3)|浏览(468)

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

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) 
u3r8eeie

u3r8eeie1#

看看android文档中的媒体播放器状态图
MediaPlayer状态图
根据该图,您必须在调用start()之前调用setDataSource()和prepare()。
可能之前发生了一些错误,你的logcat应该会给你指出正确的方向。
我的猜测是你的MediaPlayer不是处于暂停状态而是处于停止状态。所以你必须调用Prepare,然后启动,而不仅仅是启动。
不幸的是,在这种方式下,您的播放将从头开始。
您可以使用seek命令恢复活动暂停期间保存的位置。

bqf10yzr

bqf10yzr2#

我们只需要实现MediaPlayer.OnSeekCompleteListener接口并在onSeekComplete方法中设置MediaPlayer。

private MediaPlayer mediaPlayer;

@Override
public void onSeekComplete(final MediaPlayer mp) {
    mediaPlayer = mp;
}
lmvvr0a8

lmvvr0a83#

我昨天遇到了这个问题,我想分享一下我遇到这个问题的经历、根本原因和解决我的特定问题的方法;这可能对其他人有帮助。
这是我在我的专刊中发现的。
1.我正在片段中运行MediaPlayer
1.当手机进入睡眠状态(黑屏)时,在fragment-life-cycle中调用stop()函数。

  1. MediaPlayer建议在STOP状态下释放()MediaPlayer资源。
    1.当手机恢复,它抱怨非法状态异常,因为没有可用的MediaPlayer资源,记住它是在STOPE状态释放。
    所以,为了解决这个问题,我重写了start()state,如果它在那个特定的时间点为null,我得到了另一个MediaPlayer示例。START state在恢复时调用。
    样本码
public class xMediaPlayer extends MediaPlayer
{
    private static xMediaPlayer instance = null;

    public static xMediaPlayer getInstance( )
    {
        if( instance == null )
            instance = new xMediaPlayer( );

        return instance;
    }      
}

覆盖片段上的start()

@Override
public void onStart() {
    super.onStart();      
    mMediaPlayer = xMediaPlayer.getInstance( );
}

相关问题