[
https://issues.apache.org/jira/browse/CB-10798?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15186677#comment-15186677
]
Vito Macchia commented on CB-10798:
-----------------------------------
[~jasongin] yeah, you're right: 12 is definitely PATH_EXISTS. Anyway I also
think that, whether you go for deprecating this or not, it should be clearly
visible in the docs.
I was trying to make a kind of a shared folder for my app, then I realized that
there are more robust ways (even if they require some more work) of doing this.
Anyway I still think this has something to do with the way the plugin code gets
directory permissions on 6.x because some file managers can still easily create
folders in the sdcard root directory (e.g. File Expert).
We may agree that this is not the most useful feature of this plugin and that
several workarounds can be found, but at least the documentation for Android
6.x has to be updated.
> Cannot create folder into cordova.file.externalRootDirectory on Android 6.x
> Marshmallow
> ---------------------------------------------------------------------------------------
>
> Key: CB-10798
> URL: https://issues.apache.org/jira/browse/CB-10798
> Project: Apache Cordova
> Issue Type: Bug
> Components: Plugin File
> Affects Versions: 4.1.1
> Environment: Android 6.0.1 (Nexus 9 and other 6.x devices), Cordova
> cli 6.0.0, Android platform 5.1.0
> Reporter: Vito Macchia
> Assignee: Jason Ginchereau
> Labels: android, triaged
>
> 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.
> {code:title=createDirectory.js|borderStyle=solid}
> 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)
> }
> });
> }
> {code}
> 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/
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]