您的位置:首页 > 移动开发 > Android开发

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

2017-04-06 16:33 483 查看
特别感谢: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:视频缩略图的文件路径

4000
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生成的缩略图,这样比自己重新生成快的多。再次鸣谢上面链接的作者。学习啦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: