发表于: 2018-11-16 22:19:50
0 810
一、今天完成的事情
将本地视频并加载到RecyclerView中,点击-播放
1.查询本地所有的视频
如果直接扫描整个SD卡是非常耗时的,还好Android系统在启动时就已经把整个设备中的多媒体文件信息(文件名,类型,大小等)都存到了数据库,然后提供了ContentPrivider这个API来管理这个数据库,我们可以利用ContentPrivider来获取所有的多媒体文件。
public class VideoProvider implements AbstractProvider {
private Activity context;
public VideoProvider(Activity context) {
this.context = context;
}
@Override
public List<?> getList() {
List<VideoBean> list = null;
ContentResolver contentResolver = context.getContentResolver();
if (context != null) {
Cursor cursor = contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
if (cursor != null) {
list = new ArrayList<>();
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));
String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));
String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.ALBUM));
String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.ARTIST));
String displayName = cursor.getString(cursor. getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME));
String mineType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE));
String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));
String size = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE));
String duration = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION));
VideoBean video = new VideoBean(id, title, album, artist, displayName,
mineType, path, size, duration);
list.add(video);
}
cursor.close();
}
}
return list;
}
}
接口
public interface AbstractProvider {
List<?> getList();
}
MediaStore这个类是android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取。这个MediaStore包括了多媒体数据库的所有信息,包括音频,视频和图像,android把所有的多媒体数据库接口进行了封装,所有的数据库不用自己进行创建,直接调用利用ContentResolver去掉用那些封装好的接口就可以进行数据库的操作了
ContentResolver的query方法有五个参数:
Uri:这个Uri代表要查询的数据库名称加上表的名称。这个Uri一般都直接从MediaStore里取得,获取所有歌的信息,就用MediaStore.Audio.Media. EXTERNAL_CONTENT_URI这个Uri,获取所有的视频信息就用MediaStore.Video.Media. EXTERNAL_CONTENT_URI,其他查询也都类似。
Prjs:这个参数代表要从表中选择的列,用一个String数组来表示。
Selections:相当于SQL语句中的where子句,就是代表你的查询条件。
selectArgs:这个参数是说你的Selections里有?这个符号,这里可以以实际值代替?。如果Selections这个没有?,那么这个String数组可以为null。
Order:说明查询结果排序依据。
查询完成后将所有的VideoBean对象添加到List中。
2.在RecycerView中显示视频信息
这里RecycerView的用法和以前没什么不同,只是加载视频缩略图时用了一个图片加载框架Glide
Glide是一款由Bump Technologies开发的图片加载框架,使得我们可以在Android平台上以极度简单的方式加载和展示图片,关于Glide,郭霖大神特地写了八篇博客介绍它的具体用法和源码——《Android图片加载框架最全解析》
RecyclerVidew的适配器中绑定数据的代码
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
if (mVideoBeanList != null && mVideoBeanList.size() != 0) {
VideoBean videoBean = mVideoBeanList.get(position);
holder.titleTV.setText(videoBean.getTitle());
holder.durationTV.setText(videoBean.getDuration());
RequestOptions options = new RequestOptions().centerCrop();
Glide.with(mContext)
.load(Uri.fromFile(new File(videoBean.getPath())))
.apply(options)
.into(holder.videoIV);
holder.itemView.setTag(position);
}
}
效果,时间还没有处理,显示的是毫秒
2.播放视频
点解列表子项,跳转到播放页面,同时视频路径也传过去
@Override
public void onItemClick(int position) {
Intent intent = new Intent(MainActivity.this, PlayVideoActivity.class);
intent.putExtra("path", videoBeanList.get(position).getPath());
startActivity(intent);
}
播放活动布局,只有一个JzvdStd
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.PlayVideoActivity">
<cn.jzvd.JzvdStd
android:id="@+id/jz_player_video"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</android.support.constraint.ConstraintLayout>
public class PlayVideoActivity extends BaseActivity {
private static final String TAG = "PlayVideoActivity";
private String videoPath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_video);
Intent intent = getIntent();
videoPath = intent.getStringExtra("path");
Log.i(TAG, "视频路径:" + videoPath);
String title = videoPath.substring(videoPath.lastIndexOf("/") + 1);
Log.i(TAG, "视频标题:" + title);
JzvdStd jzvdStd = (JzvdStd) findViewById(R.id.jz_player_video);
jzvdStd.setUp(videoPath, title, Jzvd.SCREEN_WINDOW_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
Jzvd.releaseAllVideos();
}
@Override
public void onBackPressed() {
if (Jzvd.backPress()) {
return;
}
super.onBackPressed();
}
}
二、明天计划的事情
调用摄像头录制视频
刷新视频列表,播放录制的视频
三、遇到的问题
四、收获
Glide
JiaoZiVideoPlayer的基本使用
评论