发表于: 2018-11-16 22:19:50

0 658


一、今天完成的事情

将本地视频并加载到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的基本使用

    

    



返回列表 返回列表
评论

    分享到