从 Uri 获取视频缩略图
Get Video Thumbnail from Uri
我想 select 我的图库中的视频。它工作正常。但是现在我想显示一个位图,因为 thumbnail.I 尝试了这段代码但它不起作用,它总是说:NullPointerException
Bitmap bitmap2 = ThumbnailUtils.createVideoThumbnail(uri.getPath, MediaStore.Video.Thumbnails.MICRO_KIND);
这一切都在 onActivityResult()
中。
如何从视频 Uri 中获取位图?
感谢您的帮助
在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)
试试这个:
Bitmap bitmap2 = ThumbnailUtils.createVideoThumbnail( uri.getPath() , MediaStore.Images.Thumbnails.MINI_KIND );
这对我有用:
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 的缩略图。
createVideoThumbnail()
需要文件路径,而不是内容 uri。
- 文件路径需要外部读取权限。
如果您收到空响应,可能是因为使用了内容 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 中的其他答案一样继续使用光标。
在最新的API24中,如果你坚持接受答案中的方法,你可能会遇到一些问题。
例如在这一行中 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 文件路径:
MediaMetadataRetriever mMMR = new MediaMetadataRetriever();
mMMR.setDataSource(context, videoUri);
bmp = mMMR.getFrameAtTime();
希望对您有所帮助
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;
}
}
对于API27,对于文档URI(1000是微秒)
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource( context, doc_uri );
Bitmap bm = mmr.getScaledFrameAtTime( 1000, MediaMetadataRetriever.OPTION_NEXT_SYNC, 128, 128 );
我想 select 我的图库中的视频。它工作正常。但是现在我想显示一个位图,因为 thumbnail.I 尝试了这段代码但它不起作用,它总是说:NullPointerException
Bitmap bitmap2 = ThumbnailUtils.createVideoThumbnail(uri.getPath, MediaStore.Video.Thumbnails.MICRO_KIND);
这一切都在 onActivityResult()
中。
如何从视频 Uri 中获取位图?
感谢您的帮助
在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)
试试这个:
Bitmap bitmap2 = ThumbnailUtils.createVideoThumbnail( uri.getPath() , MediaStore.Images.Thumbnails.MINI_KIND );
这对我有用:
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 的缩略图。
createVideoThumbnail()
需要文件路径,而不是内容 uri。- 文件路径需要外部读取权限。
如果您收到空响应,可能是因为使用了内容 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 中的其他答案一样继续使用光标。
在最新的API24中,如果你坚持接受答案中的方法,你可能会遇到一些问题。
例如在这一行中 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 文件路径:
MediaMetadataRetriever mMMR = new MediaMetadataRetriever();
mMMR.setDataSource(context, videoUri);
bmp = mMMR.getFrameAtTime();
希望对您有所帮助
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;
}
}
对于API27,对于文档URI(1000是微秒)
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource( context, doc_uri );
Bitmap bm = mmr.getScaledFrameAtTime( 1000, MediaMetadataRetriever.OPTION_NEXT_SYNC, 128, 128 );