Android开发使用SurfaceView和Mediaplayer播放网络视频(功能齐全)

本篇播客主要说明如何使用SurfaceView和Mediaplayer来播放网络视频。

支持视频格式:实测支持的有mp3、mp4、rmvb、avi、3gp、flv……。

带有功能:播放、暂停、视频拖动,播放时长显示、全屏、恢复全屏、双击暂停/播放功能、保存播放记录继续播放等等。

界面运行效果如下:

Android开发使用SurfaceView和Mediaplayer播放网络视频(功能齐全)_第1张图片


Android开发使用SurfaceView和Mediaplayer播放网络视频(功能齐全)_第2张图片


主要代码如下:

1、activity_mainvideo.xml的内容如下:



	

2、MainVideoActivity.java的主要代码如下:

主要实现以下的接口的相应方法:

OnClickListener, OnCompletionListener, OnPreparedListener, OnErrorListener,OnSeekBarChangeListener。

OnClickListener:处理点击事件。

OnCompletionListener:当视频播放完毕的时候的事件处理。

OnPreparedListener:当视频准备完成的事件处理。

OnSeekBarChangeListener:seekbar进度条的相关事件处理。

@Override
 public void onClick(View v) {
     switch (v.getId()) {
     case R.id.image_clickplay_moren:
         playUrl();
         iv_clickplay_moren.setVisibility(View.GONE);
         bt_pause.setBackgroundResource(R.drawable.videoplayer_play);
         break;
     case R.id.image_clickplay:
         if (mediaPlayer != null) {
             if (mediaPlayer.isPlaying()) {
                 mediaPlayer.pause();
                 //bt_pause.setText(STATE_CONTINUE);
                 videoPlayStateImageRefresh(true);
                 bt_pause.setBackgroundResource(R.drawable.videoplayer_pause);
             } else {
                 mediaPlayer.start();
                 //bt_pause.setText(STATE_PAUSE);
                 videoPlayStateImageRefresh(false);
                 bt_pause.setBackgroundResource(R.drawable.videoplayer_play);
                 return;
             }
         }
         break;
     case R.id.bt_pause:
         pause();
         break;
         ......//等等其他功能
     default:
         break;
     }
 }

@Override
 public boolean onError(MediaPlayer mp, int what, int extra) {
     //Toast.makeText(MainVideoActivity.this, "报错了--" + what + "--" + extra, 0).show();
     return false;
 }
 @Override
 public void onPrepared(MediaPlayer mp) {//只有准备好以后才能处理很多逻辑
     mediaPlayer.start();
     //=============
     mediaPlayer.seekTo(savedPosition);//开始时是从0开始播放,恢复时是从指定位置开始播放
     seekBar.setMax(mediaPlayer.getDuration());//将进度条的最大值设为文件的总时长
     tv_currentprogress.setText("00:05");
     tv_totalprogress.setText(String.valueOf(msConvertToMinute(mediaPlayer.getDuration())));
     timer = new Timer();
     task = new TimerTask() {
         public void run() {
             seekBar.setProgress(mediaPlayer.getCurrentPosition());//将媒体播放器当前播放的位置赋值给进度条的进度
             //tv_currentprogress.setText("00:05");
         }
     };
     timer.schedule(task, 0, 100);//0秒后执行,每隔100ms执行一次
     //Toast.makeText(MainVideoActivity.this, "开始播放!", 0).show();
 }
 
 @Override
 public void onCompletion(MediaPlayer mp) {
     Toast.makeText(MainVideoActivity.this, "本视频播放完毕!", 0).show();
     videoPlayStateImageRefresh(true);
     bt_pause.setBackgroundResource(R.drawable.videoplayer_pause);
     //mediaPlayer.reset();
     //bt_playUrl.setEnabled(true);
 }
 @Override
 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {//进度发生变化时
	 tv_currentprogress.setText(String.valueOf(msConvertToMinute(progress)));
 }
 @Override
 public void onStartTrackingTouch(SeekBar seekBar) {
 }
 @Override
 public void onStopTrackingTouch(SeekBar seekBar) {//停止拖拽时回调
     mediaPlayer.seekTo(seekBar.getProgress());//停止拖拽时进度条的进度
     tv_currentprogress.setText(String.valueOf(msConvertToMinute(seekBar.getProgress())));
 }

3、添加用户权限:(否则播放网络视频出错)

   

   

4、在AndroidManifest.xml给MainVideoActivity添加属性:

android:configChanges="keyboardHidden|orientation|screenSize"

这一步是为了避免 全屏/恢复 时,每次切换该activity都要oncreate(  )一下,这样会出错。添加之后,完美切换,没有任何影响。


完整demo下载网址:https://download.csdn.net/download/lpcrazyboy/10331900

你可能感兴趣的:(Android开发使用SurfaceView和Mediaplayer播放网络视频(功能齐全))