版权声明:本文为博主原创文章,未经博主允许不得转载。
在Android中,我们有三种方式来实现视频的播放:
1、使用其自带的播放器。指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型。
2、使用VideoView来播放。在布局文件中使用VideoView结合MediaController来实现对其控制。
3、使用MediaPlayer类和SurfaceView来实现,这种方式很灵活。
1、调用其自带的播放器:
Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()+"/Test_Movie.m4v");
//调用系统自带的播放器
Intent intent = new Intent(Intent.ACTION_VIEW);
Log.v("URI:::::::::", uri.toString());
intent.setDataAndType(uri, "video/mp4");
startActivity(intent);
2、使用VideoView来实现:
VideoView vv_main_video = (VideoView) findViewById(R.id.vv_main_video);
//给VideoView设置视频的来源
vv_main_video.setVideoPath("file://mnt/sdcard/movies/advideo.mp4");
//实例化媒体控制器
MediaController mediaController=new MediaController(this);
vv_main_video.setMediaController(mediaController);
mediaController.setMediaPlayer(vv_main_video);
vv_main_video.start();
3、使用MediaPlayer:
public class OperateMedia implements OnBufferingUpdateListener,
OnCompletionListener, OnErrorListener {
private int position = 0;// 保存播放的的位置
private SurfaceView surfaceView;// surfaceVie对象
private Context context;// 上下文对象
private MediaPlayer mediaPlayer;// mediaplayer对象
private int currentPlay = 0;// 保存当前正在播放的视频 0表示还没有记录
private boolean justBack = false;// 是否刚才另外一个界面跳回,fasle 表示不是
public OperateMedia(Context context, MediaPlayer mediaPlayer,
SurfaceView surfaceView) {
// TODO Auto-generated constructor stub
this.context = context;
this.mediaPlayer = mediaPlayer;
this.surfaceView = surfaceView;
// mediaPlayer的设置
this.mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
this.mediaPlayer.setOnBufferingUpdateListener(this);
this.mediaPlayer.setOnCompletionListener(this);
// surfaceView的设置
this.surfaceView.getHolder().setKeepScreenOn(true);
this.surfaceView.getHolder().setType(
SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
this.surfaceView.getHolder().addCallback(new SurfaceCallback()); // surfaceView的回调
}
// 设置播放不同的视频
public void loadSrc(int num) {
// 如果在次播放的是不同的视频,那么就将position初始化,并且reset,重新设置视频源
if (num != currentPlay) {
position = 0;
try {
currentPlay = num;
mediaPlayer.reset();
AssetFileDescriptor fd = null;
switch (num) {
case 0:
fd = context.getAssets().openFd("a.mp4");
break;
case 1:
fd = context.getAssets().openFd("b.mp4");
break;
case 2:
fd = context.getAssets().openFd("c.mp4");
break;
case 3:
fd = context.getAssets().openFd("d.mp4");
break;
}
mediaPlayer.setDataSource(fd.getFileDescriptor(),
fd.getStartOffset(), fd.getLength());
play();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return;// 中断当前程序
}
// 如果点击的是同一个视频。那么就不用reset了
if (num == currentPlay) {
if (justBack) {
play();
return;
} else {//如果不是从另一个activity切换回来,那么,就直接设置到0,开始播放
mediaPlayer.seekTo(0);
mediaPlayer.start();
mediaPlayer.setDisplay(surfaceView.getHolder());// 设置屏幕
}
}
}
// 播放视频
public void play() {
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
if (position > 0) {
mediaPlayer.seekTo(position);
if (justBack) {
justBack = false;
position = 0;
}
}
mediaPlayer.start();
}
});
mediaPlayer.setDisplay(surfaceView.getHolder());// 设置屏幕
}
// 视频播放完成的回调方法
public void onCompletion(MediaPlayer mp) throws IllegalStateException {
if (currentPlay == 0) {
MediaVideo.justPlay = false;
}
}
//
public void onBufferingUpdate(MediaPlayer mp, int percent)
throws IllegalStateException {
}
// SurfaceView的callBack
private class SurfaceCallback implements SurfaceHolder.Callback {
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
public void surfaceCreated(SurfaceHolder holder) {
if (position > 0) {
loadSrc(currentPlay);
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
// 界面销毁,即将跳转到另外一个界面
if (mediaPlayer.isPlaying()) {
justBack = true;
position = mediaPlayer.getCurrentPosition();
mediaPlayer.stop();
}
}
}
public boolean onError(MediaPlayer mp, int what, int extra) {
return false;
}
}