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)