FileError {code:5}尝试使用Meteor 1.4 Cordova的绝对文件路径

时间:2016-08-06 05:22:51

标签: javascript android cordova meteor

我正在尝试使用带有Cordova(移动支持)的Meteor 1.4来读取我的Android手机上的文件。

我的手机上运行了一小Meteor app(通过meteor run android-device)。我还使用adb shellrun-as在应用的私有存储中创建了一个小文本文件。

如果我拨打getFile('a'),我可以阅读该文件,但我找不到任何方式将cordova.file.dataDirectory(即使WebAppLocalServer.localFileSystemUrl)用作recommended in the Meteor guide。我得到FileError {code: 5}ENCODING_ERR)。

当我点击my app中的按钮时,这是Chrome检查器的JS控制台输出:

meteor app in chrome inspector throwing FileError code 5

  • Android 5和6上的这个重复版。
  • 我的开发环境是64位Ubuntu 14.04 LTS。
  • 我的应用的应用信息报告它具有以下权限:
    • 修改或删除SD卡的内容
    • 阅读SD卡的内容
  • 该应用使用cordova file plugin version 4.2.0
  • Dup的? How to read/write a file in Meteor-Cordova?
  • 通过USB调试在chrome://inspect控制台中工作:HTTP.call('GET', 'http://localhost:12640/local-filesystem/data/user/0/com.adammonsen.app/files/a', {}, function (e,r) {console.error(e); console.log(r)});
    • 输出为Object {statusCode: 200, content: "in external dir↵", headers: Object, data: null}

1 个答案:

答案 0 :(得分:0)

知道了。诀窍是使用window.resolveLocalFileSystemURL()来获取文件系统。以下是如何获取外部存储上的文件。我最初的问题是关于app-private存储。如果您正在寻找,请使用cordova.file.dataDirectory代替cordova.file.externalDataDirectory

function reportError(err) {
  console.error(err);
}

function readFile(file) {
  var reader = new FileReader();
  reader.onloadend = function() {
    console.log('read file! contents: ' + this.result);
  };
  reader.readAsText(file);
}

function processFileEntry(fileEntry) {
  fileEntry.file(file => {
    readFile(file);
  }, reportError);
}

Template.hello.events({
  'click button'(event, instance) {
    // increment the counter when button is clicked
    instance.counter.set(instance.counter.get() + 1);

    if (Meteor.isCordova) {
      // aaaaaand do some other stuff
      const path = cordova.file.externalDataDirectory + 'a';
      window.resolveLocalFileSystemURL(path, fileEntry => {
        console.log('fileEntry: ', fileEntry);
        processFileEntry(fileEntry);
      }, reportError);
    }
  },
});

有关完整的工作示例和说明,请参阅https://github.com/meonkeys/cordova-file-test/tree/solution

确保AndroidExtraFilesystems包含files-external。我在mobile-config.js中使用了这一行:

App.setPreference('AndroidExtraFilesystems', 'files,files-external');

我很想了解API之间的区别,但是现在我很高兴我找到了可靠的功能。