Android内置的VideoView类可以快速制作一个系统播放器,VideoVies主要用来显示一个视频文件,我们先来看看VidewView类的一些基本方法。
VideoView类的常用方法
getBufferPercentage 得到缓冲的百分比 |
getCurrentPosition 得到当前播放的位置 |
getDuration 得到视频文件的时间 |
isPlaying 是否正在播放 |
pause 暂停 |
resolveAdjustedSize 调整视频显示大小 |
seekTo 指定播放位置 |
setMediaController 设置播放控制模式(播放进度条) |
setOnCompleteionListener 当媒体文件播放完成时出发时间 |
setOnErrorListener 错误监听 |
setVideoPath 设置视频源路径 |
setVideoPath 设置视频源地址 |
start 开始播放 |
有了这些方法,我们要播放一个视频文件就很简单了,首先在布局文件中创建VideoView布局,并且创建几个按钮来实现对视频的操作。当我们点击“装载”按钮时,将指定视频文件的饿路径,如下列代码所示:
/* 设置路径*/
videoView.setVideoPath("/sdcard/test.mp4");
/* 设置模式-播放进度条*/
videoView.setMediaController(new MediaController(Activity01.this));
videoView.requestFocus();
装载之后便可以通过start,pause方法来播放和暂停,具体实现见代码清单:
package com.yarin.android.Examples_07_03;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.MediaController;
import android.widget.VideoView;
public class Activity01 extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* 创建VideoView对象 */
final VideoView videoView = (VideoView) findViewById(R.id.VideoView01);
/* 操作播放的三个按钮 */
Button PauseButton = (Button) this.findViewById(R.id.PauseButton);
Button LoadButton = (Button) this.findViewById(R.id.LoadButton);
Button PlayButton = (Button) this.findViewById(R.id.PlayButton);
/* 装载按钮事件 */
LoadButton.setOnClickListener(new OnClickListener()
{
public void onClick(View arg0)
{
/* 设置路径 */
videoView.setVideoPath("/sdcard/test.mp4");
/* 设置模式-播放进度条 */
videoView.setMediaController(new MediaController(Activity01.this));
videoView.requestFocus();
}
});
/* 播放按钮事件 */
PlayButton.setOnClickListener(new OnClickListener()
{
public void onClick(View arg0)
{
/* 开始播放 */
videoView.start();
}
});
/* 暂停按钮 */
PauseButton.setOnClickListener(new OnClickListener()
{
public void onClick(View arg0)
{
/* 暂停 */
videoView.pause();
}
});
}
}
扩展学习
上面我们通过系统自带的VideoView播放了一个MP4视频文件,但是我们知道VideoView类实际上继承自SurfaceView类,而且实现了MediaController.MediaPlayerControl接口。下面我们用SurfaceView来实现一个视频播放器。,当然需要通过SurfaceHolder来控制SurfaceView,因此需要通过getHolder方法来德奥SurfaceView的SurfaceHolder对象,具体代码如下:
package com.yarin.android.Examples_07_04;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class Activity01 extends Activity implements
OnBufferingUpdateListener,
OnCompletionListener,
MediaPlayer.OnPreparedListener,
SurfaceHolder.Callback
{
private static final String TAG = "Activity01";
private int mVideoWidth;
private int mVideoHeight;
private MediaPlayer mMediaPlayer;
private SurfaceView mPreview;
private SurfaceHolder holder;
private String path;
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.main);
mPreview = (SurfaceView) findViewById(R.id.surface);
/* 得到SurfaceHolder对象 */
holder = mPreview.getHolder();
/* 设置回调函数 */
holder.addCallback(this);
/* 设置风格 */
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
private void playVideo()
{
try
{
path = "/sdcard/test.mp4";
/* 构建MediaPlayer对象 */
mMediaPlayer = new MediaPlayer();
/* 设置媒体文件路径 */
mMediaPlayer.setDataSource(path);
/* 设置通过SurfaceView来显示画面 */
mMediaPlayer.setDisplay(holder);
/* 准备 */
mMediaPlayer.prepare();
/* 设置事件监听 */
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
catch (Exception e)
{
Log.e(TAG, "error: " + e.getMessage(), e);
}
}
public void onBufferingUpdate(MediaPlayer arg0, int percent)
{
Log.d(TAG, "onBufferingUpdate percent:" + percent);
}
public void onCompletion(MediaPlayer arg0)
{
Log.d(TAG, "onCompletion called");
}
public void onPrepared(MediaPlayer mediaplayer)
{
Log.d(TAG, "onPrepared called");
mVideoWidth = mMediaPlayer.getVideoWidth();
mVideoHeight = mMediaPlayer.getVideoHeight();
if (mVideoWidth != 0 && mVideoHeight != 0)
{
/* 设置视频的宽度和高度 */
holder.setFixedSize(mVideoWidth, mVideoHeight);
/* 开始播放 */
mMediaPlayer.start();
}
}
/* 更改时出发的事件 */
public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k)
{
Log.d(TAG, "surfaceChanged called");
}
/* 销毁 */
public void surfaceDestroyed(SurfaceHolder surfaceholder)
{
Log.d(TAG, "surfaceDestroyed called");
}
/* 当SurfaceHolder创建时触发 */
public void surfaceCreated(SurfaceHolder holder)
{
Log.d(TAG, "surfaceCreated called");
playVideo();
}
/* 销毁 */
@Override
protected void onDestroy()
{
super.onDestroy();
if (mMediaPlayer != null)
{
mMediaPlayer.release();
mMediaPlayer = null;
}
}
}