首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

The surface has been released 错误

2012-07-31 
The surface has been released 异常在使用surfaceView和MediaPlayer播放视频的时候出现了一个异常,纠结了

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已经做的很好了,自己再写这些确实费力,期望以后扩展会好点

?

1 楼 aduo_vip 2012-03-31   请问
这里  surfaceHolder 跟mediaPlayer 没有关联吗?

mediaPlayer.setDisplay() 写在哪个地方呢 2 楼 dingran 2012-04-12  

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

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


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

mediaPlayer.setDisplay(surfaceHolder);

就是这个public void setDisplay(SurfaceHolder sh)

热点排行