[
https://issues.apache.org/jira/browse/CB-10798?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15187571#comment-15187571
]
Jason Ginchereau commented on CB-10798:
---------------------------------------
@Vito Macchia I think you're right, the problem is actually that the file
plugin is not requesting Android permissions when it needs to. There was
already some code added to handle the new permission requirements of Android
6.x, but this way of creating a directory does not go through a code path that
requests permissions. I'm still investigating.
> 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]