Android createVideoThumbnail возвращает значение NULL, но выдает внутреннее исключение Runtime - PullRequest
0 голосов
/ 26 июня 2018

Эта ошибка произошла, когда я обновил SDK с 23 до 26 в моем AndroidManifest.xml и сборке Gradle.Возможно, это связано с ошибкой 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" />

Есть что-тоизменился между SDK 23 и 26, о котором я не знаю в отношении захвата растрового изображения из файла MP4?

ОБНОВЛЕНИЕ

Таким образом, настоящей проблемой оказался путь к изображению.Похоже на SDK 26, когда вы получаете данные, возвращенные из намерения (в данном случае захвата видео), если вы используете следующий вызов:

videoSourcePath = data.getData().getPath();

Он больше не будет корректно возвращать физическое местоположение видео, но привязывает к "external_files", которые сделали путь недействительным.

То, что когда-то было возвращено, было:

/storage/emulated/0/myapp/mycustomer/newvideofile.mp4

Сейчас:

/external_files/myapp/mycustomer/newvideofile.mp4

В итоге я использовал только исходный источник, который я отправил, а не полагался на то, чтоНамерение возвращается.

1 Ответ

0 голосов
/ 26 июня 2018

Вы можете использовать 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);
             }
        });
...