使用cordova-plugin-file在cordova(离子)中从SD卡读取文件作为阵列 [英] Read File as Array From SD Card in cordova (ionic) with cordova-plugin-file
问题描述
我在我的应用程序中使用音频文件,我需要将其作为缓冲区数组。为此,我让用户选择一个文件(使用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 $的第一个参数中用什么作为
路径
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屋!