android 获取本地视频文件以及缩略图

来源:互联网 发布:淘宝苹果组装机 编辑:程序博客网 时间:2024/04/30 15:15

特别感谢:http://blog.csdn.net/qq_27062249/article/details/53462266

这个问题其实并不难,但是一开始想错了方向,主要还是知识储备太少,菜鸟一只,所以走了很多弯路,现在记录下来。

首先,第一张方法,也是我一开始用的方法:

 /**     * 从本地得到所有的视频地址     */    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;    }

其实Android内部已经对本地视频生成了缩略图,第二种方法是直接提取Android生成的缩略图,这样比自己重新生成快的多。再次鸣谢上面链接的作者。学习啦。

1 0
原创粉丝点击