Get Video Thumbnail from Uri

Viewed 18580

I want to select a video from my Gallery. It's working fine. But now I want to display a Bitmap, as a thumbnail.I tried this code and it's not working, it always says: NullPointerException

Bitmap bitmap2 = ThumbnailUtils.createVideoThumbnail(uri.getPath, MediaStore.Video.Thumbnails.MICRO_KIND);

This is all in an onActivityResult().

How can I get the Bitmap from the video Uri??

Thanks for your help

8 Answers

In the latest API 24, you may face some issues if you stick with an approach in the accepted answer.

for example in this line int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); sometimes I got W/System.err: java.lang.IllegalArgumentException: column '_data' does not exist error message.

also in the latest API, you may get SecurityException if you deal with widgets or shared content. Keep that in mind.

As for the video thumbnail from Uri - I use an approach which utilizes MediaMetadataRetriever, thus you don't need to get String filePath:

            MediaMetadataRetriever mMMR = new MediaMetadataRetriever();
            mMMR.setDataSource(context, videoUri);
            bmp = mMMR.getFrameAtTime();

Hope this helps

For API 27, for document URI (1000 is microseconds)

MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource( context, doc_uri );
Bitmap bm = mmr.getScaledFrameAtTime( 1000, MediaMetadataRetriever.OPTION_NEXT_SYNC, 128, 128 );
  1. createVideoThumbnail() needs the file path, not the content uri.
  2. The file path requires external read permissions.

If you're getting null responses, it may be from using the content uri (though the assumption in ThumbnailsUtils.java is of a corrupt video file). When I fixed that, then I was getting permissions errors.

I was able to get the file path from the content uri using the video's ID like this:

val selection = MediaStore.Video.Media._ID + " = $id"
val cursor = 
this.contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, 
selection, null, null)      

And then continue on with the cursor as in the other answers in SO.

Docs for contentResolver.query()

Cursor c = MediaStore.Video.query(cr,uri, new String[]{
    MediaStore.Video.VideoColumns._ID,
    MediaStore.Video.VideoColumns.DATA});
if (c!=null){
    c.moveToFirst();
    int id = Integer.valueOf( c.getString(0) );
    c.close();
    BitmapFactory.Options options=new BitmapFactory.Options();
    options.inSampleSize = 1;
    try {
        return MediaStore.Video.Thumbnails.getThumbnail(cr, id, MediaStore.Video.Thumbnails.MINI_KIND, options);
    }catch (java.lang.SecurityException ex){
        ex.printStackTrace();
        //TODO: add create ThumbnailUtils.createVideoThumbnail
        return null;
    }
}

CancellationSignal ca = new CancellationSignal();

var vthumb = ThumbnailUtils.createVideoThumbnail(new File(value),new Size(120,120), ca);

This works for me:

Bitmap thumb = ThumbnailUtils.createVideoThumbnail(filePath, Thumbnails.MINI_KIND);

Using ThumbnailUtils, you can create thumbnail of two types.

MediaStore.Images.Thumbnails.MICRO_KIND - type will generate thumbnail of size 96 x 96. MediaStore.Images.Thumbnails.MINI_KIND - type will generate thumbnail of size 512 x 384.

Related