Android VideoView Error 1,0

别来无恙 提交于 2019-12-04 17:39:23

UThis is connected to your SurfaceView. Make sure you don't touch the SurfaceView after you have called prepare on you MediaPlayer and that it is visible. In your case where you try to wake up the screen make sure that everything happens in the correct order. So preparing the MediaPlayer for playback is the very last thing which your app should do. It could be that the prepare/playback is initiated prior to the app being fully awake, causing the app to attempt to manipulate the SurfaceView.

The follow code example illustrates how to trigger that kind of exception:

   private void setupVideo(String file){
      ...
      mSurfaceView = (SurfaceView) findViewById(R.id.surface);
      mHolder = mSurfaceView.getHolder(); // DON'T TOUCH BEHIND THIS POINT
      mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
      mMediaPlayer.setDisplay(mHolder);
      mMediaPlayer.setOnPreparedListener(this);
      mMediaPlayer.prepare();
   }
   @Override
   public void onPrepared(final MediaPlayer mp) {
      mSurfaceView.setVisibility(View.VISIBLE); // THIS WILL CAUSE THE ERROR
      mp.start();
   }

I had the same problem with an ICS no name tablet.

SurfaceHolder isn't created when setDisplay method is called, which cause:

03-21 14:52:36.196: W/VideoView(26612): java.lang.IllegalArgumentException: The surface has been released

To fix it, I use:

private void setupVideo(String file){
    ...
    mMediaPlayer.setOnPreparedListener(this);
    mHolder=mSurfaceView.getHolder();
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    mHolder.setKeepScreenOn(true);
    mHolder.addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            mHolder=holder;
            mMediaPlayer.setDisplay(mHolder);
            ...
            mMediaPlayer.prepare();
        }
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) { ... }
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { ... }
    });
}

@Override
public void onPrepared(final MediaPlayer mp) {
    ...
    mMediaPlayer.start();
}

I got around this issue with the below implementation.

@Override
protected void onPause()
{
    Log.v("MediaVideo", "onPause");
    super.onPause();
    this.mVideoView.pause();
    this.mVideoView.setVisibility(View.GONE);
}

@Override
protected void onDestroy()
{
    Log.v("MediaVideo", "onDestroy");
    super.onDestroy();
}

@Override
protected void onResume()
{
    Log.v("MediaVideo", "onResume");
    super.onResume();
    this.mVideoView.resume();
}

Override the OnPause and call mVideoView.pause() and the set visibility to GONE. This way I could resolve the "Activity has leaked window" log error issue.

Is your Galaxy Nexus by any chance rooted and running the Keyboard Manager app? I saw the exact same stack trace as you when testing my app out and kept noticing the following line in my logcat dumps:

06-26 08:42:49.511 I/ActivityManager(  218): START {flg=0x10050000 cmp=com.ne0fhykLabs.android.utility.km/.TransitionDialog} from pid 11150

This is the Keyboard Manager app kicking in as soon as the screen orientation changed.

As soon as I disabled the Keyboard Manager service, everything started working again with my video.

As far as I can tell, they were both using the same SurfaceHolder, and when Keyboard Manager was done with it, it was released, causing that exception when the VideoView tried to use it.

In order to get around this, you could try what is mentioned here (the site is in Chinese, but the link is translated). I haven't tried it yet, but hopefully it will work since it's using its own dedicated SurfaceView.

Reid Isaki

Overriding the onpause and onresume callbacks seemed to fix it for me and it's ONLY for the NEXUS Galaxy that has this problem.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!