使用cordova-plugin-file在cordova(离子)中从SD卡读取文件作为阵列 [英] Read File as Array From SD Card in cordova (ionic) with cordova-plugin-file

查看:1201
本文介绍了使用cordova-plugin-file在cordova(离子)中从SD卡读取文件作为阵列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的应用程序中使用音频文件,我需要将其作为缓冲区数组。为此,我让用户选择一个文件(使用Ionic / Cordova FileChooser插件)然后我得到一个像这样的URL:

I use audio files in my app that I need to get as an buffer array. For this I let the user choose a file (using Ionic/Cordova FileChooser Plugin) and then I get an URL like:

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

之后,我发送给 Cordova插件文件 resolveNativePath 功能,我得到一个路径:

After that, I sent this to Cordova Plugin File resolveNativePath function and I get a Path Like:

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)获取缓冲区数组。

and finally I call filePlugin.readAsArrayBuffer(audioFileInfo.path, audioFileInfo.name) to get the buffer array.

当文件在设备内部存储器中时,它正常工作,但是当文件到来时来自SDCard它不起作用,因为 readAsArrayBuffer 返回未找到。

It works ok when the file is in the device internal storage, but when the file comes from the SDCard it does not work because the readAsArrayBuffer returns "not found".

SD卡:

文件选择器网址

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()我得到了这个条目对象:

I have tried FilePlugins's resolveLocalFilesystemUrl() and I get this Entry object:

{
    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我不知道在 readAsArrayBuffer 路径 c> function。

Bue I have no idea what to use as path in the first parameter of the readAsArrayBuffer function.

如果我使用 fullPath name 它会抛出编码错误
如果我只得到 fullPath 中没有名称的路径,它也会抛出编码错误

If I use fullPath and name it throws encoding error. If I get just the "path" without the name from fullPath, it also throws encoding error.

有没有人有类似的经历?

Does anybody had a similar experience?

推荐答案

我最终制作了自己的FileReader来处理文件,其中包含 resolveLocalFilesystemUrl返回的信息,请注意,此代码使用Typescript

I ended up making my own FileReader to process the file with the info returned by resolveLocalFilesystemUrl, Please be aware that this code uses 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;

这篇关于使用cordova-plugin-file在cordova(离子)中从SD卡读取文件作为阵列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆