Считать файл как массив с SD-карты в cordova (ionic) с помощью cordova-plugin-file - PullRequest
0 голосов
/ 27 июня 2018

Я использую аудиофайлы в своем приложении, которые мне нужно получить в качестве буферного массива. Для этого я позволяю пользователю выбрать файл ( с помощью плагина Ionic / Cordova FileChooser ), а затем получаю URL-адрес, например:

content://com.android.providers.media.documents/document/audio%3A8431

После этого я отправил это в Файл плагина Cordova resolveNativePath и получил путь вроде:

file:///storage/emulated/0/Prueba interno/Interno, Teddybär, Dreh Dich Um__320kbps.mp3

Здесь я делаю свой audioFileInfo Объект

audioFileInfo = {name: "Interno, Teddybär, Dreh Dich Um__320kbps.mp3",
                 originalPath: "content://com.android.providers.media.documents/document/audio%3A8431",
                  path: "file:///storage/emulated/0/Prueba interno"}

и, наконец, я вызываю filePlugin.readAsArrayBuffer(audioFileInfo.path, audioFileInfo.name), чтобы получить массив буферов.

Он работает нормально, когда файл находится во внутренней памяти устройства, но когда файл поступает с SDCard, он не работает, потому что readAsArrayBuffer возвращает «not found».

SD-карта:

File Chooser URL

content://com.android.externalstorage.documents/document/3D91-1C14%3AM%C3%BAsica%20Dana%2F1%20-%20Teddyb%C3%A4r%2C%20Teddyb%C3%A4r%2C%20Dreh%20Dich%20Um__320kbps.mp3

resolveNativePath:

file:///sdcard/Música Dana/1 - Teddybär, Teddybär, Dreh Dich Um__320kbps.mp3

audioFileInfo:

audioFileInfo = {
    name :"1 - Teddybär, Teddybär, Dreh Dich Um__320kbps.mp3"
    originalPath : "content://com.android.externalstorage.documents/document/3D91-1C14%3AM%C3%BAsica%20Dana%2F1%20-%20Teddyb%C3%A4r%2C%20Teddyb%C3%A4r%2C%20Dreh%20Dich%20Um__320kbps.mp3",
    path : "file:///sdcard/Música Dana"
}

readAsArrayBuffer:

FileError {code: 1, message: "NOT_FOUND_ERR"}

Я попробовал FilePlugins resolveLocalFilesystemUrl() и получил Entry объект:

{
    filesystem: {
        name: "content",
        root: {
            filesystem {
                name: "content",
                root: "...."
            }
        },

        fullPath: "/",
        isDirectory: true,
        isFile: false,
        name: "",
        nativeURL: "content://",
    },
    fullPath: "/com.android.externalstorage.documents/document/3D91-1C14:Música Dana/1 - Teddybär, Teddybär, Dreh Dich Um__320kbps.mp3",
    isDirectory: false,
    isFile: true,
    name: "1 - Teddybär, Teddybär, Dreh Dich Um__320kbps.mp3",
    nativeURL: "content://com.android.externalstorage.documents/document/3D91-1C14%3AM%C3%BAsica%20Dana%2F1%20-%20Teddyb%C3%A4r%2C%20Teddyb%C3%A4r%2C%20Dreh%20Dich%20Um__320kbps.mp3",
}

Bue Я понятия не имею, что использовать в качестве path в первом параметре функции readAsArrayBuffer.

Если я использую fullPath и name, выдается ошибка кодирования . Если я получу только «путь» без имени из fullPath, он также выдаст ошибку кодирования .

У кого-нибудь был подобный опыт?

1 Ответ

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

В итоге я создал собственный FileReader для обработки файла с информацией, возвращаемой resolveLocalFilesystemUrl. Обратите внимание, что этот код использует Typescript

let entry = await this.filePlugin.resolveLocalFilesystemUrl(audioFileInfo.originalPath);
 let fileEntry: FileEntry = entry as FileEntry;

 console.log("fileEntry", fileEntry);

 let readFilePromise = new Promise < any > (resolve => {
     console.log("getting File from fileEntry");
     // fileEntry.getMetadata(data => {
     //     console.error("metadata", data); 
     // });
     fileEntry.file((file) => {
         console.log("File", file);
         var reader = new FileReader();

         reader.onloadend = () => {
             console.log("Successful file read: ", reader.result);
             resolve(reader.result);
         };

         reader.onprogress = (progressEvent) => {

             let fileUpdateInfo: FileLoadingUpdateInfo = {
                 audioFileInfo: audioFileInfo,
                 total: progressEvent.total,
                 loaded: progressEvent.loaded,
                 percent: parseFloat((progressEvent.loaded * 100 / progressEvent.total).toFixed(2))
             }
             this.updateAudioFileLoadingText$.next(fileUpdateInfo);
         };
         reader.onerror = (e) => {
             console.error("The reader had a problem", e)
             resolve(undefined);
         }
         reader.onabort = (e) => {
             console.error("We aborted...why???", e)
             resolve(undefined);
         }
         console.log("using reader to readAsArrayBuffer ");
         reader.readAsArrayBuffer(file);


     }, (e) => {
         console.error(e)
     });
 });
 let fileBufferArray = await readFilePromise;
 console.log("fileBufferArray", fileBufferArray);

 return fileBufferArray;
...