ENCODING_ERR при попытке доступа к внешней карте памяти - PullRequest
0 голосов
/ 26 февраля 2019

Из приложения на базе cordova-android я пытаюсь прочитать содержимое внешней SD-карты (то есть съемной карты).С помощью плагина cordova.plugins.diagnostic мне удалось получить путь к SDCard.Эти данные:

file:///storage/75FF-1911
file:///storage/75FF-1911/Android/data/es. ... .myAppName/files

С помощью плагина cordova-plugin-file я пытаюсь прочитать содержимое, хранящееся в корне SDCard, но при вызове window.resolveLocalFileSystemURL() я получаю ENCODING_ERRметод.Я использую следующий код:

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имею в виду?Кажется, что этот путь не существует.

Я был бы очень признателен, если бы кто-нибудь объяснил мне, что я делаю неправильно.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Для тех, кто сталкивается с какой-то проблемой, просто знать, что эти две строки необходимо включить в файл config.xml, так как здесь указано здесь :

<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 голосов
/ 26 февраля 2019

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.

Я думаю, что ваш URL неверен, потому что у вас нет прав доступа к хранилищу.

У вас было это в файле 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, поэтому не беспокойтесь, если синтаксис кажется странным.

Надеюсь, я помог вам, не стесняйтесь, если у вас возникнут дополнительные вопросы

...