ENCODING_ERR при попытке доступа к внешней карте памяти

Из приложения на базе cordova-android я пытаюсь прочитать содержимое внешней SD-карты (то есть съемной карты). Используя 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() метод cordova.plugins.diagnostic плагин.

Что именно делает ENCODING_ERR ошибка значит? Кажется, что этот путь не существует.

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

2 ответа

Для тех, кто сталкивается с какой-то проблемой, просто чтобы знать, что эти две строки необходимо включить в 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 файл, все работало как положено.

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

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

Другие вопросы по тегам