Как получить эскиз для видео в папке / sdcard / Android / data / mypackage / files?

Запрос в MediaStore.Video.Media.EXTERNAL_CONTENT_URI возвращает только видео в /sdcard/DCIM/100MEDIA

Но я хочу получить эскизы для видео в /sdcard/Android/data/mypackage/files . Является ли это возможным ?

Вот часть моего кода:

  ContentResolver cr = getContentResolver(); String[] proj = { BaseColumns._ID }; Cursor c = cr.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, proj, null, null, null); if (c.moveToFirst()) { do { int id = c.getInt(0); Bitmap b = MediaStore.Video.Thumbnails.getThumbnail(cr, id, MediaStore.Video.Thumbnails.MINI_KIND, null); Log.d("*****My Thumbnail*****", "onCreate bitmap " + b); ImageView iv = (ImageView) findViewById(R.id.img_thumbnail); iv.setImageBitmap(b); } while( c.moveToNext() ); } c.close(); 

Solutions Collecting From Web of "Как получить эскиз для видео в папке / sdcard / Android / data / mypackage / files?"

Если вы находитесь на android-8 (Froyo) или выше, вы можете использовать ThumbnailUtils.createVideoThumbnail :

 Bitmap thumb = ThumbnailUtils.createVideoThumbnail(path, MediaStore.Images.Thumbnails.MINI_KIND); 

Используйте Glide, чтобы получить эскиз в async.

  Glide.with(context) .load(videoFilePath) // or URI/path .into(imgView); //imageview to set thumbnail to 

Вы можете просто использовать FFmpegMediaMetadataRetriever и забыть об отражении:

 /** * * @param path * the path to the Video * @return a thumbnail of the video or null if retrieving the thumbnail failed. */ public static Bitmap getVideoThumbnail(String path) { Bitmap bitmap = null; FFmpegMediaMetadataRetriever fmmr = new FFmpegMediaMetadataRetriever(); try { fmmr.setDataSource(path); final byte[] data = fmmr.getEmbeddedPicture(); if (data != null) { bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); } if (bitmap == null) { bitmap = fmmr.getFrameAtTime(); } } catch (Exception e) { bitmap = null; } finally { fmmr.release(); } return bitmap; } 
 BitmapFactory.Options options = new BitmapFactory.Options(); options.inDither = false; options.inPreferredConfig = Bitmap.Config.ARGB_8888; Bitmap bitmapThumb = MediaStore.Video.Thumbnails.getThumbnail(mActivity.getContentResolver(), Long.parseLong(video_id), Images.Thumbnails.MINI_KIND, options); 

Используйте опции для загрузки растрового изображения с уменьшением размера растрового изображения.

Получить видеоролик из VIDEO_ID :

 public static Drawable getVideoThumbnail(Context context, int videoID) { try { String[] projection = { MediaStore.Video.Thumbnails.DATA, }; ContentResolver cr = context.getContentResolver(); Cursor cursor = cr.query( MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI, projection, MediaStore.Video.Thumbnails.VIDEO_ID + "=?", new String[] { String.valueOf(videoID) }, null); cursor.moveToFirst(); return Drawable.createFromPath(cursor.getString(0)); } catch (Exception e) { } return null; } 

См. Ответ @Ajji:

  Glide.with(context) .load(videoFilePath) // or URI/path .into(imgView); //imageview to set thumbnail to 

Он иногда возвращает черное изображение, эта проблема уже упоминается в проблемах библиотеки Glide

Используйте этот код:

  BitmapPool bitmapPool = Glide.get(activity).getBitmapPool(); int microSecond = 6000000;// 6th second as an example VideoBitmapDecoder videoBitmapDecoder = new VideoBitmapDecoder(microSecond); FileDescriptorBitmapDecoder fileDescriptorBitmapDecoder = new FileDescriptorBitmapDecoder(videoBitmapDecoder, bitmapPool, DecodeFormat.PREFER_ARGB_8888); Glide.with(activity) .load(videoPath) .asBitmap() .override(50,50)// Example .videoDecoder(fileDescriptorBitmapDecoder) .into(holder.ivFirstUpload); 

Вот аналогичный ответ Мэтью Уиллису, но с дополнительным отражением. Зачем? Потому что наука.

 /** * * @param path * the path to the Video * @return a thumbnail of the video or null if retrieving the thumbnail failed. */ public static Bitmap getVidioThumbnail(String path) { Bitmap bitmap = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) { bitmap = ThumbnailUtils.createVideoThumbnail(path, Thumbnails.MICRO_KIND); if (bitmap != null) { return bitmap; } } // MediaMetadataRetriever is available on API Level 8 but is hidden until API Level 10 Class<?> clazz = null; Object instance = null; try { clazz = Class.forName("android.media.MediaMetadataRetriever"); instance = clazz.newInstance(); final Method method = clazz.getMethod("setDataSource", String.class); method.invoke(instance, path); // The method name changes between API Level 9 and 10. if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD) { bitmap = (Bitmap) clazz.getMethod("captureFrame").invoke(instance); } else { final byte[] data = (byte[]) clazz.getMethod("getEmbeddedPicture").invoke(instance); if (data != null) { bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); } if (bitmap == null) { bitmap = (Bitmap) clazz.getMethod("getFrameAtTime").invoke(instance); } } } catch (Exception e) { bitmap = null; } finally { try { if (instance != null) { clazz.getMethod("release").invoke(instance); } } catch (final Exception ignored) { } } return bitmap; }