1

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

VS および Android Emulator 用のマルチデバイス ハイブリッド アプリ プラグインを使用しています。

UPDATE1: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="dev@cordova.apache.org">
    Apache Cordova Team
  </author>
  <content src="index.html" />
  <access origin="*" />
  <preference name="SplashScreen" value="screen" />
  <vs:features>
    <vs:feature>org.apache.cordova.globalization@0.2.8</vs:feature>
    <vs:feature>org.apache.cordova.file@1.2.0</vs:feature>
  </vs:features>
  <vs:platformSpecificValues />
</widget>

更新 2: プラグイン v1.2.0に問題があることがわかりましたcordova.filecordova.fileプラグインのバージョンを v1.2.0 から v1.1.0 に切り替えると、成功のコールバックrequestFileSystemが呼び出されるようになります。しかし、getFileで失敗しFileNotFoundExceptionます。その理由は、相対パスが正しくない可能性があります。

UPDATE3:の誤った使用法を修正しましたreadAsText

4

1 に答える 1

1

オブジェクトの代わりにfileEntryオブジェクトを渡していますが、これは機能しません。代わりにこれを行う必要があります。readAsTextfile

  1. を呼び出してファイル オブジェクトを作成します。fileEntry.file

  2. オブジェクトを関数に渡します。この関数は、渡されたファイル オブジェクトを使用してfile呼び出しreadAsTextます。これにより、ファイルが正しく読み込まれます。

参考までに、Cordovaファイル APIを次に示します。FileReader の例で、その方法を確認できます。

読み取りが成功すると、出力ウィンドウに、I/chromium読み取ったファイルの内容を示すメッセージが表示されます。

于 2014-10-10T16:42:27.433 に答える