Android createVideoThumbnail 返回 null,但在内部抛出运行时异常
Android createVideoThumbnail returning null, but throwing Runtime Exception internally
当我在 AndroidManifest.xml 和 gradle 构建中将 SDK 从 23 升级到 26 时发生此错误。认为这可能与通过 Intent 使用外部应用程序(例如将文件传递给相机)引起的 Uri.fromFile() 错误有关,但 SDK 中的源代码似乎没有这样做。
调用看起来像这样并且路径是正确的:
Bitmap captured = ThumbnailUtils.createVideoThumbnail(videoSourcePath,MediaStore.Images.Thumbnails.FULL_SCREEN_KIND);
我已验证该文件存在并且 AndroidManifest.xml 具有外部存储权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
在从 MP4 文件捕获位图方面,SDK 23 和 26 之间有什么我不知道的变化吗?
更新
所以真正的问题原来是图像的路径。如果您使用以下调用,当您从 Intent(在本例中为视频捕获)获取数据 return 时看起来像在 SDK 26 下:
videoSourcePath = data.getData().getPath();
它将不再 return 视频的物理位置正确,而是附加 "external_files" 使路径无效。
所以曾经 returned 是:
/storage/emulated/0/myapp/mycustomer/newvideofile.mp4
现在是:
/external_files/myapp/mycustomer/newvideofile.mp4
我最终只使用了我发送的原始来源,而不是依赖 returning 的意图。
您可以使用 Glide 检索视频缩略图。
// 1st: Generate image and set to imageview
Glide.with(context).asBitmap()
.load(filePathWithExtension)
.into(imageview);
// 2nd: Get Bitmap from Glide
GlideApp.with(context)
.asBitmap()
.load(filePathWithExtension)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
// You can use **resource**.
imageview.setImageBitmap(resource);
}
});
当我在 AndroidManifest.xml 和 gradle 构建中将 SDK 从 23 升级到 26 时发生此错误。认为这可能与通过 Intent 使用外部应用程序(例如将文件传递给相机)引起的 Uri.fromFile() 错误有关,但 SDK 中的源代码似乎没有这样做。
调用看起来像这样并且路径是正确的:
Bitmap captured = ThumbnailUtils.createVideoThumbnail(videoSourcePath,MediaStore.Images.Thumbnails.FULL_SCREEN_KIND);
我已验证该文件存在并且 AndroidManifest.xml 具有外部存储权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
在从 MP4 文件捕获位图方面,SDK 23 和 26 之间有什么我不知道的变化吗?
更新
所以真正的问题原来是图像的路径。如果您使用以下调用,当您从 Intent(在本例中为视频捕获)获取数据 return 时看起来像在 SDK 26 下:
videoSourcePath = data.getData().getPath();
它将不再 return 视频的物理位置正确,而是附加 "external_files" 使路径无效。
所以曾经 returned 是:
/storage/emulated/0/myapp/mycustomer/newvideofile.mp4
现在是:
/external_files/myapp/mycustomer/newvideofile.mp4
我最终只使用了我发送的原始来源,而不是依赖 returning 的意图。
您可以使用 Glide 检索视频缩略图。
// 1st: Generate image and set to imageview
Glide.with(context).asBitmap()
.load(filePathWithExtension)
.into(imageview);
// 2nd: Get Bitmap from Glide
GlideApp.with(context)
.asBitmap()
.load(filePathWithExtension)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
// You can use **resource**.
imageview.setImageBitmap(resource);
}
});