Uploaded image for project: 'Apache Cordova'
  1. Apache Cordova
  2. CB-10798

Cannot create folder into cordova.file.externalRootDirectory on Android 6.x Marshmallow

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 4.1.1
    • None
    • cordova-plugin-file
    • 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.

      createDirectory.js
      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

          Activity

            People

              rakatyal Raghav Katyal
              lamuertepeluda Vito Macchia
              Votes:
              0 Vote for this issue
              Watchers:
              6 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: