Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
4.1.1
-
None
-
Android 6.0.1 (Nexus 9 and other 6.x devices), Cordova cli 6.0.0, Android platform 5.1.0
Description
Cannot create folder into cordova.file.externalRootDirectory on Android 6.x Marshmallow. It always returns encording error (12), while on Android 5.x (Lollipop) the same code works fine.
On Marshmallow devices I can succesfully create folders only into cordova.file.externalDataDirectory.
No matter the value of preference AndroidPersistentFileLocation or AndroidExtraFilesystems.
Code (some ES6, sorry)
This snippet uses WinJS Promises - should work with native promises as well or you can just remove promises and pass succes and fail callbacks. It should create MY_Folder/test (both folders, like mkdirp) in the SD Card (regardless if emulated or not) root directory. It works fine with 5.x devices, but returns always FileError.ENCODING_ERR on Marshmallow.
function errorCode(e) { var msg = ''; switch (e.code) { case FileError.ABORT_ERR: msg = 'ABORT_ERR'; break; case FileError.ENCODING_ERR: msg = 'ENCODING_ERR'; break; case FileError.NOT_READABLE_ERR: msg = 'NOT_READABLE_ERR'; break; case FileError.PATH_EXISTS_ERR: msg = 'PATH_EXISTS_ERR'; break; case FileError.QUOTA_EXCEEDED_ERR: msg = 'QUOTA_EXCEEDED_ERR'; break; case FileError.NOT_FOUND_ERR: msg = 'NOT_FOUND_ERR'; break; case FileError.SECURITY_ERR: msg = 'SECURITY_ERR'; break; case FileError.INVALID_MODIFICATION_ERR: msg = 'INVALID_MODIFICATION_ERR'; break; case FileError.INVALID_STATE_ERR: msg = 'INVALID_STATE_ERR'; break; default: msg = 'Unknown Error'; break; }; console.log('Error: ' + msg, "CODE", e); return msg; } const STATIC_CONTENT_DIR = 'MY_Folder/test'; function createDirectory(startDirectory = cordova.file.externalRootDirectory) { return new WinJS.Promise(function(success, fail) { window.resolveLocalFileSystemURL(startDirectory, function(directory) { console.log("FS ROOT", directory); function fileGetDir(path, cb) { console.log("*** PATH", path); var fnGetOrCreateDir = function(p, de) { var entry = p.shift(); console.log("PATH", path); if (entry) { de.getDirectory(entry, { create: true, exclusive: false }, function(dirEntry) { console.log("CR", dirEntry); fnGetOrCreateDir(p, dirEntry); }, fileFSError); } else if (cb) cb(de); }; if (path) { var arPath = path.split("/"); fnGetOrCreateDir(arPath, directory.filesystem.root); } else { if (cb) cb(directory); } } fileGetDir(STATIC_CONTENT_DIR, onSuccess); }, fileFSError); function fileFSError(e) { console.log(e.code); try { console.log("fileFSError: " + JSON.stringify(e) + errorCode(e)); fail(e); } catch (err) { fail(err); } } function onSuccess(dirEntry) { console.log(dirEntry.fullPath); success(dirEntry.fullPath) } }); }
I suspect it has something to do with the way the storage should be handled on Marshmallow, see for instance http://developer.android.com/guide/topics/data/data-storage.html and https://source.android.com/devices/storage/
Attachments
Issue Links
- duplicates
-
CB-10883 resolveLocalFileSystemURL cordova.file.externalRootDirectory is fail on android 6.0
- Reopened