【问题标题】:Issues with build.phonegap write to filebuild.phonegap 写入文件的问题
【发布时间】:2013-03-24 21:06:12
【问题描述】:

我正在尝试通过online build service 构建一个PhoneGap 应用程序,该应用程序应该在iOSAndroid 上运行,但这个问题集中在Android 部分。

应用程序的主要目标是能够访问和修改文件系统。 受Raymond Camden's blog post 的启发,我最终编写了一个与他非常相似的示例应用程序,它以读/写权限访问文件系统。主要区别在于我的应用程序是在线构建的,没有安装任何 SDK,也没有关心任何 androidManifes.xml 文件。

我的问题是我能够访问文件系统(列出目录、读取文件),但我不能在上面写任何东西。

我已包含necessary <feature /> tag in the confix.xml 以获得文件访问权限:

<feature name="http://api.phonegap.com/1.0/file"/>

这是我的应用程序中使用的一些示例代码:

读取文件代码:

// Request fileSystem
fileSystem.root.getFile(fileName, {create:true}, readFile, onError);

// Function that reads a file
function readFile(file){
    var reader = new FileReader();
    reader.onloadend = function(e) {
        console.log("contents: ", e.target.result);
    }
    reader.readAsText(file);
}

写入/追加文件代码:

fileSystem.root.getFile(fileName, {create:true}, function(file){
    file.createWriter(function(writer) {
        writer.onwrite = function() {
            console.log('writing', arguments);
        }

        writer.onerror = function(e) {
            console.error('error', e);
        }

        writer.onwriteend = function() {
            console.log('writeend', arguments);
        }

        //Go to the end of the file...
        writer.seek(writer.length);

        // Append a timestamp
        writerOb.write("Test at "+new Date().toString() + "\n");
    })
}, onError);

第二个代码示例没有在目标文件中写入任何内容,onerror 处理程序显示这是因为NOT_FOUND_ERR。这没有任何意义,因为我能够读取同一个文件(并且可以找到)。

以同样的方式,当我尝试创建一个新文件时(使用 写入/追加文件代码中的相同代码,但目标文件不存在),我得到一个 @ 987654337@错误。

我也尝试了the example in the official documentation,得到了相同的结果(读取和不写入)。

请注意,由于 PhoneGap 使用的是 HTML5 文件 API,因此我尝试按照 this Stack Overflow answer(和其他网站)中的建议通过 blobs 写入内容,但没有任何运气。

我错过了什么?我是否需要一个单独的插件来编写文件,或者这是无法通过在线构建工具完成的事情,我必须下载 SDK 并以老式方式编译应用程序?

P.S.:我的 PhoneGap 版本是 2.3.0

【问题讨论】:

  • 手机有SD卡吗?正常编译也行吗?
  • @Warpzit 是的,手机有 SD 车,目标文件在上面;不,我只通过 build.phonegap.com 尝试过
  • fileName 的实际值是多少?你是想写在根目录还是子目录?

标签: javascript android cordova phonegap-plugins phonegap-build


【解决方案1】:

我已经使用 PG 构建创建了an app,它写入文件系统,所以我确信它可以完成并且不需要插件。我在代码中看到的主要显着差异是我明确地将 getFile 选项中的独占标志设置为 false。

如果您正在使用 iOS 进行测试,另一种解决方案是检查您是否在 config.xml 中正确设置了应用 ID

编辑:在我提到的应用程序中,文件系统编写代码是here

【讨论】:

    【解决方案2】:

    这是我用于写入文件的 Java 方法:

    public void writeMyFile(String fileName, String data) throws IOException {
    
        File root = Environment.getExternalStorageDirectory();
        System.out.println(root);
        File gpxfile = new File(root, fileName);
    
        FileWriter writer = new FileWriter(gpxfile);
        String[][] recordvalue = new String[100][100];
        System.out.println("fetched value" + data);
        String[] line = data.split("#");
    
        // I had multiple lines of data, all split by the # symbol in a single string.
        System.out.println("row length "+line.length);
    
            for (int i=1; i<line.length; i++)
            {
                writer.append("#");
                recordvalue[i] = line[i].split(",");
                for(int j=0; j<recordvalue[i].length; j++) {
                    System.out.println(recordvalue[i][j]);
                    writer.append(recordvalue[i][j]);
                    writer.append(",");
                }
                writer.append("\n");
            }
    
        Uri uri = Uri.fromFile(gpxfile);
        System.out.println(uri);
    
        writer.flush();
        writer.close();
    
        try {
            // Do something
        }
        catch (Exception e) {
            // If there is nothing that can send a text/html MIME type
            e.printStackTrace();
        }
    }
    

    类/方法的导入如下:

    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    
    import org.apache.cordova.api.PluginResult;
    import org.json.JSONArray;
    
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Environment;
    import android.util.Log;
    
    import com.phonegap.api.Plugin;
    

    插件的主要执行类如下:

    public PluginResult execute(String arg0, JSONArray arg1, String arg2) {
        try {
             String fileName = arg1.getString(0);
             String data = arg1.getString(1);
             writeMyFile(fileName, data);
        }
        catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
    

    【讨论】:

    • 为他的问题提供解决方案,而不是建议其他方式。这也可以作为评论发布。
    • 这是解决方案。他使用的代码只是我代码的一小部分。我基本上是在给他所有他缺少的部分,以确保他拥有完整的工作代码。
    【解决方案3】:

    首先,请确保在设备准备就绪后以正确的方式拨打requestFileSystem

    function onDeviceReady() {
        window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, yourCode, fail);
    }
    

    其次,确保fileName只是一个没有路径的文件名,如果你想使用目录,你应该使用DirectoryEntry

    【讨论】:

    • 这正是我请求文件系统的方式,正如我所说,我可以访问(读取)文件
    • fileName 是文件名还是路径?我记得使用文件路径时遇到问题,如果它适用于阅读但不适用于写作,我不会感到惊讶。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 2012-04-10
    • 2011-04-18
    • 1970-01-01
    相关资源
    最近更新 更多