当我在AndroidManifest.xml和gradle构建中将SDK从23升级到26时,发生了此错误。以为这可能与Uri.fromFile()错误有关,该错误是由于使用Intent(例如,将文件传递给Camera)而使用外部应用程序引起的,但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返回的数据(在本例中为视频捕获)中时,在SDK 26下看起来像:
videoSourcePath = data.getData().getPath();
它将不再正确返回视频的物理位置,而是添加了“ external_files”,这使路径无效。
所以曾经返回的是:
/storage/emulated/0/myapp/mycustomer/newvideofile.mp4
现在是:
/external_files/myapp/mycustomer/newvideofile.mp4
我最终只是使用发送的原始源,而不是依赖Intent返回的内容。
答案 0 :(得分:1)
您可以使用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);
}
});