`
dingran
  • 浏览: 371080 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

The surface has been released 异常

阅读更多

在使用surfaceView和MediaPlayer播放视频的时候出现了一个异常,纠结了很久,经过同事帮助,终于发现了问题的根源。

 

异常如下:

 

E/AndroidRuntime( 1765): Caused by: java.lang.IllegalArgumentException: The surface has been released
E/AndroidRuntime( 1765):     at android.media.MediaPlayer._setVideoSurface(Native Method)
E/AndroidRuntime( 1765):     at android.media.MediaPlayer.setDisplay(MediaPlayer.java:633)

 

 

原因是在surfaceHolder还没准备好的时候,我就调用了MediaPlayer的start()方法。

 

正确的播放流程应该是:

 

        surfaceView = (SurfaceView) findViewById(R.id.PlaySurfaceView);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);

 

      mediaPlayer.setDisplay(surfaceHolder);

 

try {
           
            mediaPlayer.setDataSource(this, Uri.parse("/sdcard/bianxing.ts"));
           
        } catch (IllegalArgumentException e1) {
            e1.printStackTrace();
        } catch (SecurityException e1) {
            e1.printStackTrace();
        } catch (IllegalStateException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
       
        try {
            mediaPlayer.prepare();
        } catch (IllegalStateException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
       
        mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
           
            @Override
            public void onPrepared(MediaPlayer mp) {
               
                mediaPlayer.start();
               
            }
        });

 

这样就可以正常播放了,唉,不容易啊,感谢同事的帮助。

 

其实对Medialayer的封装来说,VideoView已经做的很好了,自己再写这些确实费力,期望以后扩展会好点

 

分享到:
评论
8 楼 qzrsqzrsqzrs 2016-09-02  
7 楼 u011262505 2015-03-17  
纳尼,我发现我还是有这个问题
6 楼 Evilover3 2013-03-12  
请问一下,我是直接使用videoView,然后将整个view加载到WindowManager中,然后就提示这个log,请问是怎么弄呢?
5 楼 dingran 2013-02-06  
aduo_vip 写道
请问
这里  surfaceHolder 跟mediaPlayer 没有关联吗?

mediaPlayer.setDisplay() 写在哪个地方呢


surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);



      mediaPlayer.setDisplay(surfaceHolder);

这就是他们的关系和顺序啊。
4 楼 yye_javaeye 2013-02-05  
不能解决啊,这个代码当处在一个activity里时,addCallback()里面放什么呢?
3 楼 dadoneo 2012-07-09  
这是在SurfaceView继承类里边写的还是在Activity里边写的,此问题困扰我很久了,按LZ方法仍是不行啊,创建surface时返回空值
2 楼 dingran 2012-04-12  


aduo_vip 写道
请问
这里  surfaceHolder 跟mediaPlayer 没有关联吗?

mediaPlayer.setDisplay() 写在哪个地方呢



不好意思,少了点东西,应该是在addCallBack后设置:

mediaPlayer.setDisplay(surfaceHolder);

就是这个public void setDisplay(SurfaceHolder sh)
1 楼 aduo_vip 2012-03-31  
请问
这里  surfaceHolder 跟mediaPlayer 没有关联吗?

mediaPlayer.setDisplay() 写在哪个地方呢

相关推荐

Global site tag (gtag.js) - Google Analytics