Не удается заставить плагин cordova.file работать в гибридном приложении.

У меня проблема с чтением файла из файловой системы с помощью плагина cordova.file. Я использую следующий пример кода:

    function onInitFs(fileSystem) {
        console.log("filesystem loaded!");
        fileSystem.root.getFile(filePath, {}, function (fileEntry) {
            console.log("DirectoryEntry.getFile succeeded!");
            fileEntry.file(function (file) {
                console.log("FileEntry.file succeeded!");
                var reader = new FileReader();

                reader.onloadend = function (e) {
                    //file contents are in this.result
                };

                reader.readAsText(file);
            }, console.log);
        }, console.log);
    }

    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onInitFs, console.log);

И вот сообщение об ошибке, которое я вижу в окне вывода:

D/PluginManager( 2597): init()
E/cutils  (  915): Failed to mkdirat(/storage/sdcard/Android): Read-only file system
W/ContextImpl( 2597): Failed to ensure directory: /storage/sdcard/Android/data/io.cordova.<myappname>/files
W/System.err( 2597): java.lang.NullPointerException
W/System.err( 2597):    at org.apache.cordova.file.FileUtils.getAvailableFileSystems(FileUtils.java:132)
W/System.err( 2597):    at org.apache.cordova.file.FileUtils.initialize(FileUtils.java:192)
W/System.err( 2597):    at org.apache.cordova.PluginEntry.createPlugin(PluginEntry.java:96)
W/System.err( 2597):    at org.apache.cordova.PluginManager.startupPlugins(PluginManager.java:195)
W/System.err( 2597):    at org.apache.cordova.PluginManager.init(PluginManager.java:106)
W/System.err( 2597):    at org.apache.cordova.CordovaWebView.loadUrlIntoView(CordovaWebView.java:457)
W/System.err( 2597):    at org.apache.cordova.CordovaWebView.loadUrlIntoView(CordovaWebView.java:444)
W/System.err( 2597):    at org.apache.cordova.CordovaWebView.loadUrlIntoView(CordovaWebView.java:541)
W/System.err( 2597):    at org.apache.cordova.CordovaWebView.loadUrl(CordovaWebView.java:435)
W/System.err( 2597):    at org.apache.cordova.CordovaActivity.loadUrl(CordovaActivity.java:391)
W/System.err( 2597):    at io.cordova.<myappname>.onCreate(ApprovalsHybrid.java:33)
W/System.err( 2597):    at android.app.Activity.performCreate(Activity.java:5231)
W/System.err( 2597):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
W/System.err( 2597):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
W/System.err( 2597):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
W/System.err( 2597):    at android.app.ActivityThread.access$800(ActivityThread.java:135)
W/System.err( 2597):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
W/System.err( 2597):    at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err( 2597):    at android.os.Looper.loop(Looper.java:136)
W/System.err( 2597):    at android.app.ActivityThread.main(ActivityThread.java:5017)
W/System.err( 2597):    at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err( 2597):    at java.lang.reflect.Method.invoke(Method.java:515)
W/System.err( 2597):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
W/System.err( 2597):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
W/System.err( 2597):    at dalvik.system.NativeStart.main(Native Method)
I/System.out( 2597): Error adding plugin org.apache.cordova.file.FileUtils.
W/Vold    (  915): Returning OperationFailed - no handler for errno 30

Я использую подключаемый модуль Multi-Device Hybrid Apps для эмулятора VS и Android.

ОБНОВЛЕНИЕ 1: мой config.xml:

<?xml version="1.0" encoding="utf-8"?>
<widget xmlns:cdv="http://cordova.apache.org/ns/1.0" xmlns:vs="http://schemas.microsoft.com/appx/2014/htmlapps" id="io.cordova.<myappname>" version="1.0.0.0" xmlns="http://www.w3.org/ns/widgets">
  <name><myappname></name>
  <description>
    A blank project that uses Apache Cordova to help you build an app that targets multiple mobile platforms: Android, iOS, Windows, and Windows Phone.
  </description>
  <author href="http://cordova.io" email="[email protected]">
    Apache Cordova Team
  </author>
  <content src="index.html" />
  <access origin="*" />
  <preference name="SplashScreen" value="screen" />
  <vs:features>
    <vs:feature>[email protected]</vs:feature>
    <vs:feature>[email protected]</vs:feature>
  </vs:features>
  <vs:platformSpecificValues />
</widget>

ОБНОВЛЕНИЕ 2: хорошо, я понял, что есть некоторые проблемы с cordova.file плагином версии 1.2.0. Когда я переключаю версию плагина cordova.file с версии 1.2.0 на версию 1.1.0, я дохожу до момента, когда вызывается обратный вызов успеха requestFileSystem. Но getFile терпит неудачу с FileNotFoundException. Причиной этого может быть неправильный относительный путь.

ОБНОВЛЕНИЕ 3: исправлено неправильное использование readAsText


person Shalom Aleichem    schedule 10.10.2014    source источник
comment
Что у тебя в конфиге?   -  person Markus_DE_HH    schedule 10.10.2014
comment
Я добавил содержимое config.xml в вопрос   -  person Shalom Aleichem    schedule 10.10.2014


Ответы (1)


Вы передаете объект fileEntry объекту readAsText вместо объекта file, который не будет работать. Вы должны сделать это вместо этого.

  1. Создайте файловый объект, вызвав fileEntry.file

  2. Передайте объект file функции, которая затем вызовет readAsText с переданным файловым объектом. Это позволит правильно прочитать файл.

Вот file API Cordova для справки. Вы можете увидеть, как это делается в примере с FileReader.

Когда чтение завершится успешно, в окне вывода появится сообщение I/chromium с содержимым только что прочитанного файла.

person Avani    schedule 10.10.2014
comment
Это хороший момент, я это исправлю, но обратный вызов успеха вызова getFile еще даже не вызывается. - person Shalom Aleichem; 10.10.2014