java.lang.Illegalargumentexception: the surface has been released

功能:进入一个activity,使用MediaPlayer和SurfaceView类来播放视频,启动activity时,直接初始化做MediaPlayer.start(),而不是通过一个监听器什么的来启动,就会出现:The surface has been released.
错误位置:mediaplayer.setDisplay(surfaceView.getHost());
原因:mediaPlayer对象没有做好准备。
为什么?想想,如果你做一个监听,那么,视频就不是直接播放了,他有充分时间做准备了,就不会有错误了。
解决方法:写一个通过一个ScheduledExecutorService和Handler类来解决。看代码,不多。[mw_shl_code=java,true]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();
        }

你可能感兴趣的:(类,视频,mediaplayer,Surface)