How to get thumbnail for video in my /sdcard/Android/data/mypackage/files folder?

后端 未结 12 1707
情深已故
情深已故 2020-11-30 22:21

Query to MediaStore.Video.Media.EXTERNAL_CONTENT_URI returns only video in /sdcard/DCIM/100MEDIA

But I want to get thumbnails for video in

相关标签:
12条回答
  • 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();
            }
    
    0 讨论(0)
  • 2020-11-30 23:08
    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 Options to load bitmap of decrease the bitmap size..

    0 讨论(0)
  • 2020-11-30 23:09

    Use Glide it will fetch the thumbnail in async.

     Glide.with(context)
                        .load(videoFilePath) // or URI/path
                        .into(imgView); //imageview to set thumbnail to
    
    0 讨论(0)
  • 2020-11-30 23:10

    If you are on android-8 (Froyo) or above, you can use ThumbnailUtils.createVideoThumbnail:

    Bitmap thumb = ThumbnailUtils.createVideoThumbnail(path,
        MediaStore.Images.Thumbnails.MINI_KIND);
    
    0 讨论(0)
  • 2020-11-30 23:10

    If you are directly creating thumbnails as follows

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

    Then there is a problem with this method if your are creating thumbnails for large video set(for large number of videos). the application will freeze until all the thumbnails are loaded because all the process are executing in the main thread.


    Use SuziLoader

    This loader will load the thumbnails for the videos which is locally stored on your filesystem in background.

    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
    

    To get this dependency use the following steps

    Step 1. Add the JitPack repository to your build file
    Add it in your root build.gradle at the end of repositories:

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

    Step 2. Add the dependency

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

    ADD READ EXTERNAL STORAGE Permission in manifest

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    
    0 讨论(0)
  • 2020-11-30 23:15

    Here is a similar answer to Matthew Willis but with added reflection. Why? because science.

    /**
     *
     * @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;
    }
    
    0 讨论(0)
提交回复
热议问题