Cordova Android FileReader.readAsDataURL NOT_FOUND_ERR - PullRequest
0 голосов
/ 09 июня 2019

Я использую cordova-plugin-file и cordova-plugin-media-capture для захвата видео на iOS и Android. Эта реализация прекрасно работает на iOS, но не на Android. Я отследил проблему, когда экземпляр FileReader не смог найти файл, записанный cordova-plugin-media-capture. Вот блок кода:

if (navigator && navigator.device.capture && window.cordova.file) {
    navigator.device.capture.captureVideo((mediaFiles: MediaFile[]) => {
        if (mediaFiles.length > 0) {
            const mediaFile = mediaFiles[0];
            const type = mediaFile.type;
            window.resolveLocalFileSystemURL((mediaFile as any).localURL, (fileEntry: Entry) => {
                (fileEntry as FileEntry).file((file: File) => {
                    // "file" is a valid file with a local URL (cdvfile://localhost/sdcard/DCIM/....)
                    const fileReader = new FileReader();
                    fileReader.onloadend = (event: ProgressEvent) => {
                        console.log(event);
                        // event.target.error = 1 here which according to the docs is NOT_FOUND_ERR
                        success({ data: (event.target as any).result, type });
                    };
                    fileReader.readAsDataURL(file);
                }, (_error: FileError) => {
                    console.log(_error);
                });
            }, (_error: FileError) => {
                console.log(_error);
            });
        }
    }, (_error: CaptureError) => {
        console.log(_error);
    }, { limit: 1, duration: 10, quality: 1 });
}

Есть идеи, что может быть причиной этого? Вот что я пробовал:

  1. Добавлено <preference name="AndroidPersistentFileLocation" value="Compatibility" /> к config.xml. Удалено после того, как этот подход не работает.
  2. Добавлено <access origin="cdvfile://*"/> в config.xml. Удалено после того, как это не сработало.
  3. Гарантированный CSP включает cdvfile:
  4. Гарантировано AndroidManifest.xml имеет android.permission.WRITE_EXTERNAL_STORAGE и android.permission.READ_EXTERNAL_STORAGE
  5. Подтверждено, что видео действительно существуют на телефоне, просмотрев приложение Файлы. Видео воспроизводится просто отлично.

Тестирование на Android 8 с Moto G6.

Заранее спасибо.

1 Ответ

0 голосов
/ 11 июня 2019

После отладки cordova-plugin-file я обнаружил, что сообщаемое NOT_FOUND_ERR вводит в заблуждение, поскольку оказывается, что существует проблема с разрешениями.

cordova-plugin-file error

Я думал, что достаточно было поместить разрешения на чтение из внешнего хранилища в манифест, но это не так. Android требует разрешения во время выполнения: https://developer.android.com/training/permissions/requesting.html

После добавления разрешений во время выполнения процесс захвата видео работает как положено.

...