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();
        }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值