下面分享一个播放视频的小组件,
player = new MyPlayer(surfaceView, seekBar);
用法,需要用到surfaceview 和 seekbar,
部分代码,设置视频全屏
//全屏 fullBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isScreen) { topView.setVisibility(View.GONE); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); screentRl.setLayoutParams(layoutParams); isScreen=!isScreen; }else{ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, UiUtils.dp2px(DscvGbActivity.this,200)); screentRl.setLayoutParams(layoutParams); topView.setVisibility(View.VISIBLE); isScreen=!isScreen; } } });
2,全屏时还有监听返回键,
@Override public void onBackPressed() { if(isScreen){ super.onBackPressed(); }else { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, UiUtils.dp2px(DscvGbActivity.this,206)); screentRl.setLayoutParams(layoutParams); topView.setVisibility(View.VISIBLE); isScreen=!isScreen; } }
下面是 自定义的播放视频的小组件
public class MyPlayer implements MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener, SurfaceHolder.Callback,MediaPlayer.OnErrorListener { private int videoWidth; private int videoHeight; public MediaPlayer mediaPlayer; private SurfaceHolder surfaceHolder; private SeekBar skbProgress; private Timer mTimer = new Timer(); private PreListener listener; public MyPlayer(SurfaceView surfaceView, SeekBar skbProgress) { this.skbProgress = skbProgress; surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mTimer.schedule(mTimerTask, 0, 1000); } /******************************************************* * 通过定时器和Handler来更新进度条 ******************************************************/ TimerTask mTimerTask = new TimerTask() { @Override public void run() { if (mediaPlayer == null) return; if (mediaPlayer.isPlaying() && skbProgress.isPressed() == false) { handleProgress.sendEmptyMessage(0); } } }; Handler handleProgress = new Handler() { public void handleMessage(Message msg) { int position = mediaPlayer.getCurrentPosition(); int duration = mediaPlayer.getDuration(); if (duration > 0) { long pos = skbProgress.getMax() * position / duration; skbProgress.setProgress((int) pos); } } ; }; //***************************************************** public void play() { mediaPlayer.start(); } public void playUrl(String videoUrl) { try { if(mediaPlayer==null){ mediaPlayer = new MediaPlayer(); mediaPlayer.setDisplay(surfaceHolder); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setOnBufferingUpdateListener(this); mediaPlayer.setOnPreparedListener(this); mediaPlayer.setOnErrorListener(this); } mediaPlayer.reset(); mediaPlayer.setDataSource(videoUrl); mediaPlayer.prepareAsync();//prepare之后自动播放 //mediaPlayer.start(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block LogUtil.e("11111"+e.toString()); } catch (IllegalStateException e) { // TODO Auto-generated catch block LogUtil.e("11112"+e.toString()); } catch (IOException e) { // TODO Auto-generated catch block LogUtil.e("11113"+e.toString()); }catch (Exception e){ LogUtil.e("11114"+e.toString()); } } public void pause() { if(mediaPlayer!=null) mediaPlayer.pause(); } public void stop() { if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; } } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { LogUtil.e("mediaPlayer" + "surface changed"); } @Override public void surfaceCreated(SurfaceHolder arg0) { try { if(mediaPlayer==null) { mediaPlayer = new MediaPlayer(); mediaPlayer.setDisplay(surfaceHolder); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setOnBufferingUpdateListener(this); mediaPlayer.setOnPreparedListener(this); mediaPlayer.setOnErrorListener(this); } } catch (Exception e) { LogUtil.e("mediaPlayer" + "error" + e); } LogUtil.e("mediaPlayer" + "surface created"); } @Override public void surfaceDestroyed(SurfaceHolder arg0) { LogUtil.e("mediaPlayer" + "surface destroyed"); } @Override /** * 通过onPrepared播放 */ public void onPrepared(MediaPlayer arg0) { videoWidth = mediaPlayer.getVideoWidth(); videoHeight = mediaPlayer.getVideoHeight(); if (videoHeight != 0 && videoWidth != 0) { arg0.start(); } arg0.start(); LogUtil.e("mediaPlayer" + "onPrepared"); if(listener!=null){ listener.onListener(0); } } @Override public boolean onError(MediaPlayer mp, int what, int extra) { LogUtil.e("播放失败=======================+what"+what); if(what==MediaPlayer.MEDIA_ERROR_UNKNOWN && listener!=null){ listener.onListener(1); } return false; } public interface PreListener{ void onListener(int tag); } public void setListener(PreListener listener){ this.listener = listener; } @Override public void onCompletion(MediaPlayer arg0) { // TODO Auto-generated method stub LogUtil.e("onCompletion"); } @Override public void onBufferingUpdate(MediaPlayer arg0, int bufferingProgress) { skbProgress.setSecondaryProgress(bufferingProgress); try { int currentProgress = skbProgress.getMax() * mediaPlayer.getCurrentPosition() / mediaPlayer.getDuration(); LogUtil.e(currentProgress + "% play" + bufferingProgress + "% buffer"); } catch (Exception e) { LogUtil.e("onBufferingUpdate="+e.toString()); } } public boolean isPlayering1() { return mediaPlayer == null ? false : mediaPlayer.isPlaying(); } }