
目前这些app就会有短视频内容android videoview,这里就来讲一下android中播放视频的几种方式。
Android播放视频有三种模式:
1,调用平台已有的播放工具播放视频。
2android videoview,使用android提供的VideoView控件定制自己的视频播放器。
3,使用MediaPlayer和SurfaceView定制自己的视频播放器。
第一种方式最简单了:
//调用系统自带的播放器
Uri uri = Uri.parse("/storage/emulated/0/DCIM/Camera/VID_20161103_105921.mp4");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "video/mp4");
startActivity(intent);
就android4.2.2的例程来看 ,系统自带的播放器程序是Gallery2
/packages/apps/Gallery2
通过清单文件,可以了解处理该intent的activity:

看一下这个MovieActivity.java
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
。。
setContentView(R.layout.movie_view);
View rootView = findViewById(R.id.movie_view_root);
setSystemUiVisibility(rootView);
Intent intent = getIntent();
。。。
mPlayer = new MoviePlayer(rootView, this, intent.getData(), savedInstanceState,
!mFinishOnCompletion) {
@Override
public void onCompletion() {
if (mFinishOnCompletion) {
finish();
}
}
};
主要用到MoviePlayer,看一下这个MoviePlayer类做了啥
public MoviePlayer(View rootView, final MovieActivity movieActivity,
Uri videoUri, Bundle savedInstance, boolean canReplay) {
mContext = movieActivity.getApplicationContext();
mRootView = rootView;
mVideoView = (VideoView) rootView.findViewById(R.id.surface_view);
mBookmarker = new Bookmarker(movieActivity);
mUri = videoUri;
mController = new MovieControllerOverlay(mContext);
((ViewGroup)rootView).addView(mController.getView());
mController.setListener(this);
mController.setCanReplay(canReplay);
mVideoView.setOnErrorListener(this);
mVideoView.setOnCompletionListener(this);
mVideoView.setVideoURI(mUri);
mVideoView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mController.show();
return true;
}
});
// The SurfaceView is transparent before drawing the first frame.
// This makes the UI flashing when open a video. (black -> old screen
// -> video) However, we have no way to know the timing of the first
// frame. So, we hide the VideoView for a while to make sure the
// video has been drawn on it.
mVideoView.postDelayed(new Runnable() {
@Override
public void run() {
mVideoView.setVisibility(View.VISIBLE);

这个mVideoView是VideoView类型
所以通过下面代码可以清楚,android自带的播放器也是使用VideoView这个控件来实现的。
那么接着就讲一下第二种方式,使用VideoView定制自己的视频播放器
VideoView看名字需要是View的子类

VideoView的直接父类是SurfaceView .关于SurfaceView前面Android视图SurfaceView的使用一文已做简单介绍。
SurfaceView可以用来显示手机的预览界面,也可以拿来显示视频的数据。
下面就来看一下如何使用VideoView。
使用VideoView播放视频也是两种形式:
一种是只使用VideoView进行播放视频,自己自定义播放进度,播放状况的发力,然后自己控制播放
另一种就是VideoView结合MediaController播放视频,这种方法不需要自己写布局去控制播放。
下面先看第一方式:
结合代码和效果图一起分析下是怎样推动播放视频的:
用手机录制了一段视频,然后用写的应用程序来播放这段视频(真机测试的)


启动应用发现界面如上:
看一下布局文件:
<framelayout android:id="@+id/activity_main" android:layout_height="match_parent" android:layout_width="match_parent" tools:context="cj.com.videoviewdemo2.MainActivity" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
<framelayout android:alpha="0" android:id="@+id/cover" android:layout_height="match_parent" android:layout_width="match_parent"></framelayout>
</framelayout>
MyVideoView是用来播放视频的,ImageView是用来显示视频的缩略图的(还未开始播放,先显示缩略图,覆盖VideoView那块区域,因为一开始VideoView那块区域是白色的),cover (FrameLayout)是用来控制 CheckBox 和 LinearLayout 隐藏与显示,CheckBox是控制播放与中止,LinearLayout就是显示播放进度的发力,两个TextView分别是显示当前播放的时间和总时间,SeekBar就是显示进度,可以拖曳到任意位置播放。
下面的代码片段就是设置视频预览照片
private void initVideoView() {
Log.d(TAG,"initVideoView ");
Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(PATH, MINI_KIND);
if(bitmap != null){
preview.setImageBitmap(bitmap);
}
videoView.setVideoURI(Uri.parse(PATH));
}
这里用到了ThumbnailUtils这个软件,参考官网文档:
VideoView播放视频,需要传入视频资源,传入方法有下列几种:

关于VideoView官方文档:
我这儿播放本地视频,当然也可以播放网络视频。
点击CheckBox进行播放,看一下播放效果:


看一下代码:

playOrPause.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.d(TAG,"onCheckedChanged isChecked="+isChecked);
if(isChecked){//暂停
videoView.pause();
positon = videoView.getCurrentPosition();
}else{//播放
videoView.seekTo(positon);
videoView.start();
playOrPause.setVisibility(View.GONE);
preview.setVisibility(View.GONE);
}
}
});
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-123742-1.html
在维护国家主权的问题上