Android MediaPlayer 类在活动恢复后抛出 java.lang.IllegalStateExceptio



我正在尝试在活动 onPause(( 和 onResume(( 方法中使用 MediaPlayer 暂停和恢复 VideoView,但在 onResume(( 方法中,MediaPlayer 抛出 java.lang.IllegalStateException。我没有发布媒体播放器,但我认为媒体播放器在活动暂停后自动发布。 我应该如何处理?

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) 

看看安卓文档上的媒体播放器状态图

媒体播放器状态图

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

可能之前发生过什么问题。您的日志猫应该为您指明正确的方向。

我的猜测是您的媒体播放器不是处于暂停状态,而是处于停止状态。所以你必须打电话给准备然后开始,而不仅仅是开始。

不幸的是,通过这种方式,您的播放将从头开始。

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

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

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

我昨天遇到了这个问题,我想分享我面对这个问题的经验,根本原因和我的特定问题的修复程序;这可能对其他人有所帮助。

这是我在我的特定问题中发现的。

  1. 我在片段中运行媒体播放器
  2. 当手机进入睡眠状态(黑屏(时,在片段生命周期中调用 stop(( 函数。
  3. MediaPlayer
  4. 建议在 STOP 状态下释放(( MediaPlayer 资源。
  5. 当手机恢复时,它会抱怨非法状态异常,因为没有可用的媒体播放器资源,请记住它是在 STOPE 状态下发布的。

所以,要修复它。我覆盖了 start(( 状态,如果它在那个特定时间点为空,我得到了另一个 MediaPlayer 实例。恢复时调用 START 状态。

示例代码

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

相关内容

  • 没有找到相关文章

最新更新