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