本来我是想开发 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;
}
这样好像会有些视频的图片会获取不到,我们可以再配合上面缩略图获取方法的代码来获取,这样就可以啦…