Cordova: невозможно прочитать содержимое файла с SDCard - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь прочитать содержимое файла, расположенного в /storage/emulated/0/..., используя cordova-plugin-file . Я могу получить связанный FileEntry и прочитать некоторые свойства, такие как имя, тип или размер, но когда я использую FileReader для чтения содержимого, происходит сбой с FileError {code: 1}

FileError - API утверждает, что код ошибки 1 - NOT_FOUND_ERR, но я уверен, что файл существует. Как я уже сказал, я могу получить его размер (я проверил, что значение верное!).

Я использую следующий код для проверки:

window.resolveLocalFileSystemURL(
  "cdvfile://localhost/sdcard/ticket/fake.pdf",
  function(fileEntry) {
    console.log("ENTRY URL " + fileEntry.toURL());
    console.log("IS FILE: " + fileEntry.isFile);

    fileEntry.file(function(file){
      console.log("FILE: " + file.name);
      console.log("SIZE: " + file.size);
      console.log("TYPE: " + file.type);

      var reader = new FileReader();
      reader.onloadend = function() {
        console.log("READER END");
        console.log(this.result);
      };
      reader.onerror = function(er) {
        console.log("READER ERROR");
        console.log(er);
      };

      reader.readAsDataURL(file);
    }, console.error);
  },
  console.error
);

вывод is:

ENTRY URL file:///storage/emulated/0/ticket/fake.pdf
IS FILE: true
FILE: fake.pdf
SIZE: 32471
TYPE: application/pdf
READER ERROR
ProgressEvent {type: "error", bubbles: false, cancelBubble: false, cancelable: false, lengthComputable: false, …}
READER END

где: ProgressEvent.target равно FileReader и ProgressEvent.target._error равно FileError {code: 1}

Я также пробовал использовать другие пути или файлы:

  • file:///storage/emulated/0/ticket/fake.pdf

  • file:///storage/emulated/0/DCIM/Camera/IMG_20190412_110205.jpg

AndroidManifest. xml имеет:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Ответы на другие похожие вопросы, которые я нашел, предлагают в качестве решения то, что я уже делаю.

ОБНОВЛЕНИЕ:

Это Кажется, проблема с разрешениями. Если я сделаю

window.resolveLocalFileSystemURL("cdvfile://localhost/sdcard/ticket/fake.pdf", okFunction, errorHandler);

, это не вызовет запрос разрешения для пользователя. Но это происходит с:

window.resolveLocalFileSystemURL("cdvfile://localhost/sdcard/ticket/fake.pdf", function(f) {
  f.filesystem.root.getFile(f.fullPath, {}, okFunction, errorHandler)
}, errorHandler);

Как только пользователь принимает разрешение, все методы работают нормально.

Теперь мой вопрос, почему, если я использую FileEntry из window.resolveLocalFileSystemURL для чтения контент, который не запрашивает разрешение, но делает для FileEntry из filesystem.root.getFile.

...