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