本篇播客主要说明如何使用SurfaceView和Mediaplayer来播放网络视频。
支持视频格式:实测支持的有mp3、mp4、rmvb、avi、3gp、flv……。
带有功能:播放、暂停、视频拖动,播放时长显示、全屏、恢复全屏、双击暂停/播放功能、保存播放记录继续播放等等。
界面运行效果如下:
主要代码如下:
1、activity_mainvideo.xml的内容如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:orientation="vertical"
android:background="@color/bg_white" >
<Button
android:id="@+id/bt_playUrl1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放网络多媒体"
android:visibility="gone" />
<RelativeLayout
android:id="@+id/rlayout_video"
android:layout_width="match_parent"
android:layout_height="200dp"
>
<SurfaceView
android:id="@+id/sv"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/image_clickplay_moren"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="center"
android:src="@drawable/videoplayer_clickplay"
/>
<ImageView
android:id="@+id/image_clickplay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="center"
android:src="@drawable/videoplayer_clickplay"
android:visibility="gone"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="horizontal"
android:padding="10dp">
<Button
android:id="@+id/bt_pause"
android:layout_width="30dp"
android:layout_height="30dp"
android:background="@drawable/videoplayer_pause"
android:layout_gravity="center_vertical"
android:layout_marginRight="10dp"/>
<TextView
android:id="@+id/tv_currentProgress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="9dp"
android:text="00:00"
android:textColor="@color/text_white"
android:layout_gravity="center_vertical"
/>
<SeekBar
android:id="@+id/seekBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"/>
<TextView
android:id="@+id/tv_totalProgress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="9dp"
android:textColor="@color/text_white"
android:layout_gravity="center_vertical"
/>
<Button
android:id="@+id/bt_maxsize"
android:layout_width="25dp"
android:layout_height="25dp"
android:background="@drawable/videoplayer_maxsize"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"/>
<Button
android:id="@+id/bt_minisize"
android:layout_width="25dp"
android:layout_height="25dp"
android:background="@drawable/videoplayer_minisize"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"
android:visibility="gone"/>
</LinearLayout>
</RelativeLayout>
</LinearLayout>
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、添加用户权限:(否则播放网络视频出错)
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.INTERNET"/>
4、在AndroidManifest.xml给MainVideoActivity添加属性:
android:configChanges="keyboardHidden|orientation|screenSize"
这一步是为了避免 全屏/恢复 时,每次切换该activity都要oncreate( )一下,这样会出错。添加之后,完美切换,没有任何影响。
完整demo下载网址:https://download.youkuaiyun.com/download/lpcrazyboy/10331900