android 视频播放

android 有三种视频播放方式
1 surfaceView + MediaPlayer 组合

   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.play_activity);

        seekBarVideo =(SeekBar)findViewById(R.id.seekBar_video);
        mediaPlayer = new MediaPlayer();
        pathString = "https://video.c-ctrip.com/videos/u00b0c00000065uyyBF17.mp4";
        holder = surfaceView.getHolder();
        holder.addCallback(this);
        try {
            mediaPlayer.setDataSource(pathString);
            mediaPlayer.prepare();
        } catch (IllegalArgumentException e1) {
            e1.printStackTrace();
        } catch (SecurityException e1) {
            e1.printStackTrace();
        } catch (IllegalStateException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        mediaPlayer.start();
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
               mediaPlayer.setDisplay(holder);
                int max=mediaPlayer.getDuration();
                seekBarVideo.setMax(max);
                //定时器更新进度条
                timer=new Timer();
                timeTask=new TimerTask() {
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        seekBarVideo.setProgress(mediaPlayer.getCurrentPosition());
                    }
                };
                timer.schedule(timeTask, 0, 500);

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if (mediaPlayer!=null&&mediaPlayer.isPlaying()) {
                currentPosition=mediaPlayer.getCurrentPosition();
                mediaPlayer.stop();
                mediaPlayer.release();
                mediaPlayer=null;
                timer.cancel();
                timeTask.cancel();
                timer=null;
                timeTask=null;
            }

    }

在这里容易出现问题
mediaPlayer.setDisplay(holder);
容易报 SurfaceHolder holder can not release
问题出现在mdiaPlayer 中没有初始化好,所以我门会实现 SurfaceHolder 中的CallBack 接口

public void surfaceCreated(SurfaceHolder holder) {}
中设置 mediaPlayer.setDisplay(holder);

在播放视频的时候,我们经常会把视频切换到后台,这时候会回调

@Override
@Override
public void surfaceDestroyed(SurfaceHolder holder) {

所以我们在切到后台,然后切换到前台的时候,SurfaceView 会需要重新创建,所以 创建surfaceView 的实例最好放在onResume 中去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值