【问题标题】:Get Video Thumbnail from Uri从 Uri 获取视频缩略图
【发布时间】:2017-10-21 21:16:39
【问题描述】:

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

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

这一切都在onActivityResult() 中。

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

感谢您的帮助

【问题讨论】:

标签: android video thumbnails android-bitmap


【解决方案1】:

在最新的 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();

希望对你有帮助

【讨论】:

  • 如果你听commonsware,这应该是最好的方法......我们不应该处理文件或绝对路径,我们应该处理可以通过内容访问的内容uri供应商...
  • 我们能得到画廊展示的缩略图吗?我的意思是谷歌照片应用显示不同的拇指我们可以得到完全相同的拇指吗?
  • 这很好用,我试图在 getFrameAtTime 中输入一个数字,它给出了一个黑色图像,看来你必须把它留空......谢谢
【解决方案2】:

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)

【讨论】:

  • 不应该是MediaStore.Video.Media.DATA吗?这是相同的值,但为了严格起见......
  • 它不适用于 Android 26。错误是:“原因:android.database.CursorIndexOutOfBoundsException:请求的列:-1,列数:0”。有什么想法吗?
  • 我的视频文件的 uri 格式如下:“content://{appId}.fileprovider/external_files/Android/data/{appId}/files/789080a6-0ee1-4efd-8b2a-dd6869be593f ”。查询未找到该文件,因此 columnIndex 为 -1;对这个问题有什么想法吗?
  • 如果我以这种方式更改我的 uri,光标为空。
  • 位图为空。
【解决方案3】:

试试这个:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:
      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()

      【讨论】:

        【解决方案6】:
        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;
            }
        }
        

        【讨论】:

        • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请edit您的回答添加一些解释,包括您所做的假设。
        【解决方案7】:

        这对我有用:

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

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

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

        【讨论】:

          猜你喜欢
          • 2019-12-19
          • 2013-08-31
          • 2011-05-25
          • 2020-06-26
          • 1970-01-01
          • 1970-01-01
          • 2013-06-05
          • 2020-05-16
          • 2018-11-06
          相关资源
          最近更新 更多