从基于cordova-android的应用程序,我正在尝试读取存储在外部SD卡(即可移动卡)中的内容。通过使用cordova.plugins.diagnostic
插件,我设法获得了SD卡的路径。这些细节是:
file:///storage/75FF-1911
file:///storage/75FF-1911/Android/data/es. ... .myAppName/files
通过使用cordova-plugin-file
插件我试图读取存储在SD卡的根目录中的内容,但我在调用ENCODING_ERR
方法时得到了window.resolveLocalFileSystemURL()
。我正在使用的代码如下:
url = "file:///storage/75FF-1911";
window.resolveLocalFileSystemURL(url, onSuccessResolveLocalFileSystemURL, onError);
onSuccessResolveLocalFileSystemURL : function(directoryEntry) {
//never called
}
onError : function(fileError) {
var msg = "";
console.log("onError():called");
switch (fileError.code) {
...
case FileError.ENCODING_ERR: // 5
msg = 'ENCODING_ERR';
break;
...
}
console.log("onError():" + fileError.code + " - " + msg);
}
当应用程序执行时,我总是得到这个跟踪:
onError():called
onError():5 - ENCODING_ERR
我不明白为什么window.resolveLocalFileSystemURL()
插件的cordova-plugin-file
方法在我传递给包含从getExternalSdCardDetails()
插件的cordova.plugins.diagnostic
方法获得的路径的字符串时失败。
ENCODING_ERR
错误究竟是什么意思?似乎这条路不存在。
如果有人能向我解释我做错了什么,我真的很感激。
对于那些面临一些问题的人,只要知道需要在config.xml
文件中包含这两行,因为它设置了here:
<preference name="AndroidPersistentFileLocation" value="Compatibility" />
<preference name="AndroidExtraFilesystems" value="files,files-external,documents,sdcard,cache,cache-external,root" />
但是,在我的config.xml
文件中,为"sdcard,cache"
首选项设置AndroidExtraFilesystems
值就足够了,即:
<preference name="AndroidPersistentFileLocation" value="Compatibility" />
<preference name="AndroidExtraFilesystems" value="sdcard,cache" />
我遇到的问题是我的IDE以某种方式在config.xml
中的$(My_PROJECT)\platforms\android\res\xml
文件中包含了那些首选项。
在第二个config.xml
文件中删除这些行后,一切都按预期工作。
https://developer.mozilla.org/en-US/docs/Web/API/FileError
从这个链接我们可以看到:
ENCODING_ERR 5 The URL is malformed. Make sure that the URL is complete and valid.
我认为您的网址很糟糕,因为您无权访问存储空间。
你有没有进入你的config.xml?
<preference name="AndroidExtraFilesystems" value="sdcard,cache" />
在我的一个生产中的cordova项目中,我使用了一个函数来测试每次读/写之前的访问,如下所示:
AskForAutorizationStatus: function(onSuccess, onError) {
var me = this;
// If it is on iOS, do not ask for authorization
if (Ext.platformTags.ios) {
Ext.Function.bind(onSuccess, me).call(me);
}
else {
// Request for authorization
cordova.plugins.diagnostic.requestExternalStorageAuthorization((status) => {
cordova.plugins.diagnostic.getExternalStorageAuthorizationStatus((status) => {
// if authorization ok
if(status === cordova.plugins.diagnostic.permissionStatus.GRANTED){
Ext.Function.bind(onSuccess, me).call(me);
}
else {
Ext.Function.bind(onError, me).call(me);
}
}, () => {});
}, () => {});
}
}
这是一个ExtJS代码,所以如果语法看起来很奇怪,请不要担心。
我希望我能帮助你,如果你有任何进一步的问题,请不要犹豫