本来我是想开发 Android 一个本地视频播放器的,但是现在好像一拖再拖了… 先记录一下我是怎么获取本地视频文件以及缩略图的吧…

第一种方法 ,这种方法是获取本地视频,但是没有缩略图

// 从本地得到所有的视频地址

private List<EntityVideo> getVideoFromSDCard(Context context) {
    List<EntityVideo> list = new ArrayList<>();
    String[] projection = new String[]{MediaStore.Video.Media.DATA, MediaStore.Video.Media.DURATION};
    Cursor cursor = context.getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, projection, null,null, null);
    while (cursor.moveToNext()) {
        String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));
        long duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION));
        // EntityVideo video = new EntityVideo(path, duration, getVideoThumbnail(path));
        // list.add(video);
    }
    cursor.close();
    return list;
}

缩略图获取的方法 ,也是网上大部分的方法:

// 获取视频缩略图

public Bitmap getVideoThumbnail(String filePath) {
    Bitmap b=null;
    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    try {
        retriever.setDataSource(filePath);
        b=retriever.getFrameAtTime();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (RuntimeException e) {
        e.printStackTrace();

    } finally {
        try {
            retriever.release();
        } catch (RuntimeException e) {
            e.printStackTrace();
        }
    }
    return b;
}

这种方法就是获取视频的地址,然后获取缩略图,但是在我的项目里面我感到怎么都不满意,加载图片的速度太慢啦。无意间发现下面这种方法,原来,contentProvider 已经提供了本地视频的缩略图获取方法,代码如下:

public List<EntityVideo> getList(Context context) {
    List<EntityVideo> sysVideoList = new ArrayList<>();
    // MediaStore.Video.Thumbnails.DATA:视频缩略图的文件路径
    String[] thumbColumns = {MediaStore.Video.Thumbnails.DATA,
            MediaStore.Video.Thumbnails.VIDEO_ID};
    // 视频其他信息的查询条件
    String[] mediaColumns = {MediaStore.Video.Media._ID,
            MediaStore.Video.Media.DATA, MediaStore.Video.Media.DURATION};

    Cursor cursor = context.getContentResolver().query(MediaStore.Video.Media
                    .EXTERNAL_CONTENT_URI,
            mediaColumns, null, null, null);

    if (cursor == null) {
        return sysVideoList;
    }
    if (cursor.moveToFirst()) {
        do {
            EntityVideo info = new EntityVideo();
            int id = cursor.getInt(cursor
                    .getColumnIndex(MediaStore.Video.Media._ID));
            Cursor thumbCursor = context.getContentResolver().query(
                    MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI,
                    thumbColumns, MediaStore.Video.Thumbnails.VIDEO_ID
                            + "=" + id, null, null);
            if (thumbCursor.moveToFirst()) {
                info.setThumbPath(thumbCursor.getString(thumbCursor
                        .getColumnIndex(MediaStore.Video.Thumbnails.DATA)));
            }
            info.setPath(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media
                    .DATA)));
            info.setDuration(cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video
                    .Media.DURATION)));
            sysVideoList.add(info);
        } while (cursor.moveToNext());
    }
    return sysVideoList;
}

这样好像会有些视频的图片会获取不到,我们可以再配合上面缩略图获取方法的代码来获取,这样就可以啦…