2014-10-10 48 views
1

我在使用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 

我使用的是多設備混合應用程序插件VS和Android模擬器。

UPDATE1:​​3210

<?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> 

UPDATE2:好吧,我想通了,也有一些問題cordova.file插件V1.2.0。當我將cordova.file插件版本從v1.2.0切換到v1.1.0時,我開始調用requestFileSystem的成功回調。但getFileFileNotFoundException而失敗。原因可能是不正確的相對路徑。

UPDATE3:固定readAsText

+0

什麼在您的配置? – 2014-10-10 10:39:39

+0

我已將config.xml內容添加到問題 – 2014-10-10 15:43:24

回答

1

不正確使用你傳遞一個fileEntry對象readAsText而不是file對象,這是行不通的。你應該這樣做。

  1. 通過調用fileEntry.file

  2. 傳遞file對象一個函數,然後調用readAsText使用傳入的文件對象創建一個文件對象。這將在文件中正確讀取。

這裏是科爾多瓦file API供您參考。您可以在FileReader示例中看到它是如何完成的。

當讀取成功時,輸出窗口將顯示I/chromium消息及其剛剛讀取的文件內容。

+0

這是一個很好的觀點,我會解決它,但'getFile'調用的成功回調甚至沒有被調用。 – 2014-10-10 16:53:43

相關問題