尝试访问外部存储卡时为ENCODING_ERR

时间:2019-02-25 21:36:21

标签: javascript cordova cordova-plugins android-external-storage

我正在从一个基于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错误的确切含义是什么?看来此路径不存在。

如果有人能向我解释我在做什么错,我将非常感激。

2 个答案:

答案 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代码,因此不用担心语法是否奇怪。

希望我能对您有所帮助,如果您有其他疑问,请不要犹豫