加载视频缩略图列表

Posted DevLi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加载视频缩略图列表相关的知识,希望对你有一定的参考价值。

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Rect;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.orhanobut.logger.Logger;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

/**
 * Created by lbhsot on 2017/6/13.
 */

public class VideoActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private GridLayoutManager manager;
    private VideoActivity.VideoAdapter adapter;

    private Cursor cursor;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(com.pizidea.imagepicker.R.layout.act_video);
        recyclerView = (RecyclerView) findViewById(com.pizidea.imagepicker.R.id.recyclerview);
        manager = new GridLayoutManager(this, 3);
        recyclerView.setLayoutManager(manager);
        recyclerView.addItemDecoration(new VideoActivity.SpaceItemDecoration(10));
        initVideoData();
        new Thread(new Runnable() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        adapter.setList(getAllVideoFiles(VideoActivity.this));
                    }
                });
            }
        }).start();
    }

    static String[] thumbColumns = new String[]{MediaStore.Video.Thumbnails.DATA, MediaStore.Video.Thumbnails.VIDEO_ID};
    static String[] mediaColumns = new String[]{MediaStore.Video.Media.DATA, MediaStore.Video.Media._ID, MediaStore.Video.Media.TITLE, MediaStore.Video.Media.MIME_TYPE};

    private void initVideoData(){

        //首先检错SDcard上所有的video
        cursor = this.managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, mediaColumns, null, null, null);
        printLog();
        adapter = new VideoActivity.VideoAdapter(this);
        recyclerView.setAdapter(adapter);
    }

    private static void printLog(){
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
        Logger.d(sdf.format(date));
    }

    public static ArrayList<VideoActivity.VideoInfo> getAllVideoFiles(Context mContext) {
        VideoActivity.VideoInfo video;
        ArrayList<VideoActivity.VideoInfo> videos = new ArrayList<>();
        ContentResolver contentResolver = mContext.getContentResolver();
        printLog();
        try {
            Cursor cursor = contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null,
                    null, null, MediaStore.Video.Media.DATE_MODIFIED + " desc");
            while (cursor.moveToNext()) {
                video = new VideoActivity.VideoInfo();

                if (cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media.DURATION)) != 0) {
                    video.setDuration(cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media.DURATION)));
                    video.setVideoPath(cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA)));
                    video.setCreateTime(cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATE_ADDED)));
                    video.setVideoName(cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DISPLAY_NAME)));
                    //获取当前Video对应的ID, 然后根据该ID获取缩略图
                    int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));
                    String selection = MediaStore.Video.Thumbnails.VIDEO_ID + "=?";
                    String[] selectionArgs = new String[]{
                            id + ""
                    };
                    ContentResolver crThumb = mContext.getContentResolver();
                    BitmapFactory.Options options=new BitmapFactory.Options();
                    options.inSampleSize = 1;
                    Bitmap curThumb = MediaStore.Video.Thumbnails.getThumbnail(crThumb, id, MediaStore.Video.Thumbnails.MICRO_KIND, options);

                    video.thumbBitmap = curThumb;
                    videos.add(video);
                    printLog();
                }
            }

            cursor.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return videos;
    }

    class VideoAdapter extends RecyclerView.Adapter<VideoActivity.VideoAdapter.Holder>{

        private Context context;
        private ArrayList<VideoActivity.VideoInfo> list = new ArrayList<>();

        public VideoAdapter(Context context){
            this.context = context;
        }

        private void setList(ArrayList<VideoActivity.VideoInfo> list){
            this.list = list;
            notifyDataSetChanged();
        }

        @Override
        public VideoActivity.VideoAdapter.Holder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new VideoActivity.VideoAdapter.Holder(LayoutInflater.from(context).inflate(com.pizidea.imagepicker.R.layout.item_video, parent, false));
        }

        @Override
        public void onBindViewHolder(VideoActivity.VideoAdapter.Holder holder, int position) {
            if (holder instanceof VideoActivity.VideoAdapter.Holder){
//                Glide.with(context).asBitmap().load(list.get(position).thumbBitmap).into(holder.imageView);
                holder.imageView.setImageBitmap(list.get(position).thumbBitmap);
                Date date = new Date(list.get(position).getDuration());
                SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
                holder.textView.setText(sdf.format(date));
            }
        }

        @Override
        public int getItemCount() {
            return list.size();
        }

        class Holder extends RecyclerView.ViewHolder{

            TextView textView;
            ImageView imageView;

            public Holder(View itemView) {
                super(itemView);
                imageView = (ImageView) itemView.findViewById(com.pizidea.imagepicker.R.id.image);
                textView = (TextView) itemView.findViewById(com.pizidea.imagepicker.R.id.text);
            }
        }
    }

    static class VideoInfo{
        String filePath;
        String mimeType;
        Bitmap thumbBitmap;
        String title;
        long time;

        long duration;
        String videoPath;
        String createTime;
        String videoName;

        public String getFilePath() {
            return filePath;
        }

        public void setFilePath(String filePath) {
            this.filePath = filePath;
        }

        public String getMimeType() {
            return mimeType;
        }

        public void setMimeType(String mimeType) {
            this.mimeType = mimeType;
        }

        public Bitmap getThumbBitmap() {
            return thumbBitmap;
        }

        public void setThumbBitmap(Bitmap thumbBitmap) {
            this.thumbBitmap = thumbBitmap;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public long getTime() {
            return time;
        }

        public void setTime(long time) {
            this.time = time;
        }

        public long getDuration() {
            return duration;
        }

        public void setDuration(long duration) {
            this.duration = duration;
        }

        public String getVideoPath() {
            return videoPath;
        }

        public void setVideoPath(String videoPath) {
            this.videoPath = videoPath;
        }

        public String getCreateTime() {
            return createTime;
        }

        public void setCreateTime(String createTime) {
            this.createTime = createTime;
        }

        public String getVideoName() {
            return videoName;
        }

        public void setVideoName(String videoName) {
            this.videoName = videoName;
        }
    }

    class SpaceItemDecoration extends RecyclerView.ItemDecoration{
        private int space;

        public SpaceItemDecoration(int space){
            this.space = space;
        }

        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            outRect.left = space;
            outRect.bottom = space;

            if (parent.getChildLayoutPosition(view) % 3 == 0){
                outRect.left = 0;
            }
        }
    }
}

这里会有个问题,getThumbnail方法会比较耗时,应该找找有没有别的方法可以替代。

以上是关于加载视频缩略图列表的主要内容,如果未能解决你的问题,请参考以下文章

如何显示 youtube 视频缩略图

加载视频缩略图 - JavaFx

从视频网址创建缩略图!

在加载视频之前将Youtube视频缩略图设置为背景图像

播放器图标在视频缩略图加载到视频播放器之前显示

如何创建从Android视频文件路径视频缩略图