MediaStore.Video.Thumbnails.getThumbnail獲取本地視訊縮圖
阿新 • • 發佈:2019-01-03
原理:通過 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};
// 只獲取視訊 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);
}
}
四原始碼