爱上soso 发表于 2013-8-28 16:28

IllegArugException: The surface has been released

1功能:进入一个activity,使用MediaPlayer和SurfaceView类来播放视频,启动activity时,直接初始化做MediaPlayer.start(),而不是通过一个监听器什么的来启动,就会出现:The surface has been released.   
错误位置:mediaplayer.setDisplay(surfaceView.getHost());   
原因:mediaPlayer对象没有做好准备。   
为什么?想想,如果你做一个监听,那么,视频就不是直接播放了,他有充分时间做准备了,就不会有错误了。   
解决方法:写一个通过一个ScheduledExecutorService和Handler类来解决。看代码,不多。import android.view.SurfaceView;   
   
public class PlayActivity extends Activity {   
   
      private static String path,endName;   
         
      private SurfaceHolder mSurfaceHolder;   
      private SurfaceView mSurfaceView;   
      private MediaPlayer mMediaPlayer;   
         
      private ScheduledExecutorService executorService;   
         
      private Handler handler;   
         
      @Override   
      public void onCreate(Bundle savedInstanceState) {   
                super.onCreate(savedInstanceState);   
                setContentView(R.layout.play);   
                initialize();   
      }   
         
      private void initialize(){   
                executorService = Executors.newScheduledThreadPool(1);   
                mSurfaceView = (SurfaceView) findViewById(R.id.VideoView01);   
                mSurfaceHolder = mSurfaceView.getHolder();   
                mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);   
                Intent i = getIntent();   
                path = i.getStringExtra("path");   
                endName = i.getStringExtra("endName");   
                Log.i("abc", path+","+endName);   
                handler = new Handler(new Handler.Callback() {   
                        @Override   
                        public boolean handleMessage(Message msg) {   
                              initMedia();   
                              return false;   
                        }   
                });   
                executorService.schedule(new Runnable() {   
                        @Override   
                        public void run() {   
                              handler.sendEmptyMessage(0);   
                        }   
                }, 10000, TimeUnit.MICROSECONDS);   
      }   
         
         
      private void initMedia(){   
                mMediaPlayer = new MediaPlayer();   
                mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);   
                mMediaPlayer.setDisplay(mSurfaceHolder);   
                try {   
                        mMediaPlayer.setDataSource(path);   
                        mMediaPlayer.prepare();   
                } catch (IllegalArgumentException e) {   
                        // TODO Auto-generated catch block   
                        e.printStackTrace();   
                } catch (IllegalStateException e) {   
                        // TODO Auto-generated catch block   
                        e.printStackTrace();   
                } catch (IOException e) {   
                        // TODO Auto-generated catch block   
                        e.printStackTrace();   
                }   
                mMediaPlayer.start();   
      }   
   
       http://www.apkbus.com/data/attachment/forum/201307/23/044150ao813z53mggjeg5c.png   该贴已经同步到 LinPeiChun的微博</font
页: [1]
查看完整版本: IllegArugException: The surface has been released