尝试访问外部存储卡时ENCODING_ERR

问题描述 投票:0回答:2

从基于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错误究竟是什么意思?似乎这条路不存在。

如果有人能向我解释我做错了什么,我真的很感激。

javascript cordova cordova-plugins android-external-storage
2个回答
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文件中删除这些行后,一切都按预期工作。


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" />

在我的一个生产中的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代码,所以如果语法看起来很奇怪,请不要担心。

我希望我能帮助你,如果你有任何进一步的问题,请不要犹豫

© www.soinside.com 2019 - 2024. All rights reserved.