【问题标题】:Cordova File Plugin: SECURITY_ERRCordova 文件插件:SECURITY_ERR
【发布时间】:2018-05-03 19:51:07
【问题描述】:

我有一个使用 Cordova 插件的生产环境 (iOS/Android) 混合应用程序。我有一个 Android 用户在使用 File 插件时得到了 SECURITY_ERR。这似乎是在致电writeFile() 时发生的。我为 Android 写的文件路径是externalRootDirectory

谁能帮我理解为什么 1 个用户(300-400 个)会遇到这个问题?如果有帮助,用户使用的是 Android 6.0.1。

下面是一些代码。我得到的错误是[Error creating file] – Error Msg: [SECURITY_ERR],因此在这种情况下会触发.writeFile()

  //Handle Native download
  if (this.appConfig.isNative) {
    this.loggingService.debug("Starting to create native file");
    //Get base file path for android/ios
    let filePath = (this.appConfig.isNativeAndroid) ? this.file.externalRootDirectory : this.file.cacheDirectory;

    //Write the file
    this.file.writeFile(filePath, fileName, data, { replace: true })
          .then((fileEntry: FileEntry) => {
              this.loggingService.debug("Created file: " + fileEntry.toURL());          
              //Open with File Opener plugin
              this.fileOpener.open(fileEntry.toURL(), data.type)
                .then(() => this.loggingService.debug('File is opened'))
                .catch(e => this.loggingService.error('Error openening file', e));
            })
          .catch((err) => {
             this.loggingService.error("Error creating file", err);
             throw err;  //Rethrow - will be caught by caller
          });
      }

【问题讨论】:

  • 您是否在 config.xml 中定义了AndroidExtraFilesystems-preference?应将权限 (android.permission.WRITE_EXTERNAL_STORAGE) 插入 AndroidManifest.xml 并确保该目录确实存在,如果不创建它,例如 this
  • 谢谢@Blauharley。我没有定义任何 AndroidExtraFilesystems 首选项。对于我所做的任何其他测试,我似乎都不需要它。我们有几百人毫无问题地使用它。 AndroidManifest.xml 中有一个android.permission.WRITE_EXTERNAL_STORAGE 权限。不确定是否默认添加了 File 插件?我也没有创建目录,而只是在externalRootDirectory 的根目录中创建了一个临时文件。这种情况下还需要创建目录吗?
  • 在这种情况下,不,您不必创建目录,因为您已经在您想要的位置。您不会收到带有fileWriter 的 onerror 回调的特定错误消息吗?请在这个问题中插入一些代码。
  • 可以@Blauharley - 我添加了一些代码细节。
  • 我们现在有另外 1 份报告,来自 Android 7.0 用户。因此,我们已经在 800 多个用户中的 2-3 个用户身上看到了这一点。有什么想法吗?

标签: android cordova cordova-plugin-file


【解决方案1】:

我能够弄清楚这一点。 Looks like 在 Android 6.0 之后,必须在使用应用程序期间(而不仅仅是在安装时)请求某些权限。在 Android Quirks 下的 Cordova File plugin docs 中也提到了这一点。

Marshmallow 要求应用在读取/写入外部位置时请求权限。默认情况下,您的应用程序有权写入cordova.file.applicationStorageDirectory 和cordova.file.externalApplicationStorageDirectory,除非未挂载外部存储,否则插件不会请求这两个目录的权限。但是由于限制,当没有挂载外部存储时,它会请求写入cordova.file.externalApplicationStorageDirectory的权限。

所以在 Android 6.0+ 上,当将文件写入磁盘时,Cordova File 插件将显示类似于以下内容的提示:

是否允许 APP_NAME 访问您设备上的照片、媒体和文件?

如果用户选择拒绝此请求,则 Cordova 文件写入将获得此SECURITY_ERR,即使应用在安装时请求此权限。

【讨论】:

  • 您是否最终将文件写入cordova.file.externalRootDirectory 或cordova.file.applicationStorageDirectory/cordova.file.externalApplicationStorageDirectorycordova.file?
  • 我目前写到 Android 的 file.externalDataDirectory 和 iOS 的 file.dataDirectory。到目前为止似乎在少数测试设备上工作。
  • 我看到一个错误,Permission Denied,写入 cordova.file.externalRootDirectory 时,它工作了多年,最近的插件升级做了一些改变,这个错误开始发生。有什么想法吗?
  • 我知道有一个插件可以帮助请求 android 权限 (cordova-plugin-android-permissions)。到目前为止,我还不需要在有限的测试中使用它。文件插件似乎代表我请求权限(对于我正在使用的目录)。当被问到时,somone 是否有可能拒绝权限,这导致您的权限被拒绝?我不得不要求人们在提示时拒绝权限时调整设置或卸载/重新安装。
  • 是的,我也在使用 iOS,就像你一样使用 file.dataDirectory。到目前为止对我来说没有任何问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
相关资源
最近更新 更多