MediaStore.Video.Thumbnails.getThumbnail获取本地视频缩略图
2017-11-25 18:28
579 查看
原理:通过 CursorLoader读取本地媒体数据库
一 解决录制视频后 读取媒体 数据库时,没有最新录制数据的问题
办法:通知媒体数据库更新:
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri = Uri.fromFile(file);
mediaScanIntent.setData(contentUri);
context.sendBroadcast(mediaScanIntent);
注意:当文件夹里含有 .nomedia 文件是 自带文件管理器是读不到媒体数据的
二 利用CursorLoader读取媒体数据库
private static final Uri QUERY_URI = MediaStore.Files.getContentUri("external");
private static final String ORDER_BY = MediaStore.Files.FileColumns._ID + " DESC";
读取数据库的字段: // 媒体文件数据库字段
private static final String[] PROJECTION = {
MediaStore.Files.FileColumns._ID,
MediaStore.MediaColumns.DATA,
MediaStore.MediaColumns.MIME_TYPE,
MediaStore.MediaColumns.WIDTH,
MediaStore.MediaColumns.HEIGHT,
DURATION};
读完数据库后 拿到 cursor
获取媒体库的id
通过id 可以获取对应的视频缩略图
Bitmap bitmap = MediaStore.Video.Thumbnails.getThumbnail(context.getContentResolver(),
media_id, MediaStore.Video.Thumbnails.MINI_KIND, null);这是个耗时操作 ,,如果在recycle里展示 切记在viewholder里开异步加载流畅
三recycler里展示本地视频时,,通过读取媒体库缩略图展示
解决滑动的时候viewholder复用 滑动出去一异步还加载的问题:
重写 view回收方法 获取回收的viewHolder 回收时 停止异步任务 @Override
public void onViewRecycled(RecyclerView.ViewHolder holder) {
super.onViewRecycled(holder);
ViewHolder contentHolder = (ViewHolder) holder;
ImageAsyncTask asyncTask = (ImageAsyncTask) contentHolder.contentView.getTag();
if (null != asyncTask) {
asyncTask.cancel(true);
}
}
四源码
一 解决录制视频后 读取媒体 数据库时,没有最新录制数据的问题
办法:通知媒体数据库更新:
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri = Uri.fromFile(file);
mediaScanIntent.setData(contentUri);
context.sendBroadcast(mediaScanIntent);
注意:当文件夹里含有 .nomedia 文件是 自带文件管理器是读不到媒体数据的
二 利用CursorLoader读取媒体数据库
private static final Uri QUERY_URI = MediaStore.Files.getContentUri("external");
private static final String ORDER_BY = MediaStore.Files.FileColumns._ID + " DESC";
读取数据库的字段: // 媒体文件数据库字段
private static final String[] PROJECTION = {
MediaStore.Files.FileColumns._ID,
MediaStore.MediaColumns.DATA,
MediaStore.MediaColumns.MIME_TYPE,
MediaStore.MediaColumns.WIDTH,
MediaStore.MediaColumns.HEIGHT,
DURATION};
// 只获取视频 String video_condition = getSelectionArgsForSingleMediaCondition(getDurationCondition(0, 0)); String[] MEDIA_TYPE_VIDEO = getSelectionArgsForSingleMediaType( MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO); cursorLoader = new CursorLoader( activity, QUERY_URI, PROJECTION, video_condition, MEDIA_TYPE_VIDEO, ORDER_BY);
读完数据库后 拿到 cursor
获取媒体库的id
int media_id = data.getInt(data.getColumnIndexOrThrow(PROJECTION[0]));
通过id 可以获取对应的视频缩略图
Bitmap bitmap = MediaStore.Video.Thumbnails.getThumbnail(context.getContentResolver(),
media_id, MediaStore.Video.Thumbnails.MINI_KIND, null);这是个耗时操作 ,,如果在recycle里展示 切记在viewholder里开异步加载流畅
MediaStore.Video.Thumbnails.MINI_KIND 清晰度高于
MediaStore.Video.Thumbnails.MICRO_KIND
三recycler里展示本地视频时,,通过读取媒体库缩略图展示
解决滑动的时候viewholder复用 滑动出去一异步还加载的问题:
重写 view回收方法 获取回收的viewHolder 回收时 停止异步任务 @Override
public void onViewRecycled(RecyclerView.ViewHolder holder) {
super.onViewRecycled(holder);
ViewHolder contentHolder = (ViewHolder) holder;
ImageAsyncTask asyncTask = (ImageAsyncTask) contentHolder.contentView.getTag();
if (null != asyncTask) {
asyncTask.cancel(true);
}
}
四源码
相关文章推荐
- 获取图片和视频缩略图Thumbnails ThumbnailUtils
- iOS 获取本地视频的缩略图
- [转] HTML5利用WebRTC的getUserMedia获取摄像头信息模拟拍照及视频(完整示例)
- 关于.net中获取图像缩略图的函数GetThumbnailImage的一些认识。
- HTML5利用WebRTC的getUserMedia获取摄像头信息模拟拍照及视频(完整示例)
- iOS 获取本地视频的缩略图
- 获取本地视频文件的缩略图
- 如何获取本地,网络视频的缩略图
- ThumbnailUtils.createVideoThumbnail 获取到的帧不是视频第一个关键帧
- 关于.net中获取图像缩略图的函数GetThumbnailImage的一些认识。
- Android获取本地图片、视频缩略图
- iOS 获取本地视频的缩略图
- 使用MediaStore.Images和 Cursor查询本地图片和图片缩略图
- HTML5利用WebRTC的getUserMedia获取摄像头信息模拟拍照及视频(完整示例)
- 使用MediaStore.Images和 Cursor查询本地图片和图片缩略图
- Android使用VideoView播放网络视频,获取网络视频缩略图
- ios获取本地视频缩略图
- android获取手机上的图片和视频缩略图thumbnails(转)
- Android 获取本地视频缩略图和某一帧的预览图
- Swift - 获取视频截图(本地视频、网络视频的缩略图)