¿Cómo obtener una miniatura para el video en mi carpeta / sdcard / Android / data / mypackage / files?

Consulta a MediaStore.Video.Media.EXTERNAL_CONTENT_URI devuelve solo el video en /sdcard/DCIM/100MEDIA

Pero quiero obtener miniaturas para videos en mi carpeta /sdcard/Android/data/mypackage/files . Es posible ?

Aquí está parte de mi código:

  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(); 

Si está en android-8 (Froyo) o superior, puede usar ThumbnailUtils.createVideoThumbnail :

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

Use Glide , obtendrá la miniatura en modo asíncrono.

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

Puedes simplemente usar FFmpegMediaMetadataRetriever y olvidarte de la reflexión:

 /** * * @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); 

Use las opciones para cargar el bitmap para disminuir el tamaño del bitmap.

Obtenga una miniatura de video de 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; } 

ver la respuesta de @Ajji:

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

Algunas veces devuelve una imagen negra, este problema ya se menciona en los problemas de la biblioteca Glide

Usa este código:

  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); 

Aquí hay una respuesta similar a Matthew Willis pero con una reflexión adicional. ¿Por qué? porque ciencia.

 /** * * @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; } 

Si está creando directamente miniaturas de la siguiente manera

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

Entonces hay un problema con este método si estás creando miniaturas para un gran conjunto de videos (para una gran cantidad de videos). la aplicación se congelará hasta que se carguen todas las miniaturas porque todo el proceso se está ejecutando en el hilo principal.

Usa SuziLoader

Este cargador cargará las miniaturas de los videos que se almacenan localmente en su sistema de archivos en segundo plano.

 String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/video.mp4"; ImageView mThumbnail = (ImageView) findViewById(R.id.thumbnail); SuziLoader loader = new SuziLoader(); //Create it for once loader.with(MainActivity.this) //Context .load(path) //Video path .into(mThumbnail) // imageview to load the thumbnail .type("mini") // mini or micro .show(); // to show the thumbnail 

Para obtener esta dependencia, use los siguientes pasos

Paso 1. Agregue el repository JitPack a su archivo de comstackción
Agréguelo en su build.gradle raíz al final de los repositorys:

 allprojects { repositories { ... maven { url 'https://jitpack.io' } } } 

Paso 2. Agrega la dependencia

 dependencies { compile 'com.github.sushinpv:SuziVideoThumbnailLoader:0.1.0' } 

AÑADIR LEER ALMACENAMIENTO EXTERNO Permiso en manifiesto

  

Pruebe algo similar a este fragmento de código:

 img.setImageBitmap(ThumbnailUtils.createVideoThumbnail( Environment.getExternalStorageDirectory().getPath() + "/WhatsApp/Media/WhatsApp Video/"+getItem(position), MediaStore.Video.Thumbnails.FULL_SCREEN_KIND)); 
 Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; String[] projection = { MediaStore.Video.VideoColumns.DATA }; Cursor c = getContentResolver().query(uri, projection, null, null, null); int vidsCount = 0; if (c != null) { vidsCount = c.getCount(); while (c.moveToNext()) { String path = c.getString(0); Bitmap thumb = ThumbnailUtils.createVideoThumbnail(path, MediaStore.Images.Thumbnails.MINI_KIND); } c.close(); }