我正在从一个基于cordova-android的应用程序中读取存储在外部sdcard(即可移动卡)中的内容。
通过使用cordova.plugins.diagnostic
插件,我设法获得了sdcard的路径。这些详细信息是:
file:///storage/75FF-1911
file:///storage/75FF-1911/Android/data/es. ... .myAppName/files
通过使用cordova-plugin-file
插件,我试图读取存储在sdcard根目录中的内容,但是在调用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()
方法获得路径的字符串时为什么会失败{1}}插件。
cordova.plugins.diagnostic
错误的确切含义是什么?看来此路径不存在。
如果有人能向我解释我在做什么错,我将非常感激。
答案 0 :(得分:1)
对于那些面临一些问题的人来说,只是知道需要将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
文件中删除了这些行之后,一切按预期进行。
答案 1 :(得分:0)
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" />
在我的生产中的科尔多瓦项目之一中,我使用了一个函数在每次这样的读/写之前测试访问权限:
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代码,因此不用担心语法是否奇怪。
希望我能对您有所帮助,如果您有其他疑问,请不要犹豫