1. 程式人生 > >MediaStore.Video.Thumbnails.getThumbnail獲取本地視訊縮圖

MediaStore.Video.Thumbnails.getThumbnail獲取本地視訊縮圖

原理:通過 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);
    }
  }

原始碼