从Uri获取视频缩略图

时间:2017-05-22 09:15:07

标签: android video thumbnails android-bitmap

我想从我的图库中选择一个视频。它工作正常。但现在我想显示一个Bitmap,作为缩略图。我厌倦了这段代码,它不起作用,它总是说:NullPointerException

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

这一切都在onActivityResult中。

如何从视频Uri中获取位图?

感谢您的帮助

7 个答案:

答案 0 :(得分:8)

onActivityResult

中的

String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = context.getContentResolver().query(uri, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();

Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(picturePath, MediaStore.Video.Thumbnails.MICRO_KIND);

修改

Kotlin版

val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)
val cursor = context.contentResolver.query(uri, filePathColumn, null, null, null)
cursor.moveToFirst()

val columnIndex = cursor.getColumnIndex(filePathColumn[0])
val picturePath = cursor.getString(columnIndex)
cursor.close()

val bitmap = ThumbnailUtils.createVideoThumbnail(picturePath, MediaStore.Video.Thumbnails.MICRO_KIND)

答案 1 :(得分:3)

试试这个:

Bitmap bitmap2 = ThumbnailUtils.createVideoThumbnail( uri.getPath() , MediaStore.Images.Thumbnails.MINI_KIND );

答案 2 :(得分:3)

在最新的API 24中,如果坚持接受的答案中的一种方法,您可能会遇到一些问题。

例如在此行int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);中,有时我会收到W/System.err: java.lang.IllegalArgumentException: column '_data' does not exist错误消息。

在最新的API中,如果您处理小部件或共享内容,也可能会收到SecurityException。请记住这一点。

关于Uri的视频缩略图-我使用了一种利用MediaMetadataRetriever的方法,因此您不需要获取String filePath:

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

希望这会有所帮助

答案 3 :(得分:1)

对于API 27,对于文档URI(1000毫秒)

MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource( context, doc_uri );
Bitmap bm = mmr.getScaledFrameAtTime( 1000, MediaMetadataRetriever.OPTION_NEXT_SYNC, 128, 128 );

答案 4 :(得分:0)

  1. createVideoThumbnail()需要文件路径,而不是内容uri。
  2. 文件路径需要外部读取权限。

如果收到的响应为空,则可能是由于使用了内容uri(尽管ThumbnailsUtils.java中的假设是视频文件已损坏)。解决该问题后,我遇到了权限错误。

我能够使用视频ID从内容uri获取文件路径:

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

然后像在SO中的其他答案中一样继续使用光标。

Docs for contentResolver.query()

答案 5 :(得分:0)

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

答案 6 :(得分:-1)

这对我有用:

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

使用ThumbnailUtils,您可以创建两种类型的缩略图。

MediaStore.Images.Thumbnails.MICRO_KIND - 类型将生成大小为96 x 96的缩略图。 MediaStore.Images.Thumbnails.MINI_KIND - 类型将生成大小为512 x 384的缩略图。