8

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

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

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

为了获得文件访问权限,我在confix.xml中包含了必要的<feature />标签:

<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. 这只是没有意义,因为我能够读取同一个文件(并且可以找到它)。

以同样的方式,当我尝试创建一个新文件时(使用来自write/append file code的相同代码,但目标文件不存在),我得到一个INVALID_MODIFICATION_ERR错误。

我也尝试了官方文档中的示例,得到了相同的结果(读取和不写入)。

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

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

PS:我的 PhoneGap 版本是2.3.0

4

3 回答 3

3

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

如果您正在使用 iOS 进行测试,那么在黑暗解决方案中的另一个镜头是检查您是否在 config.xml 中正确设置了您的应用程序 ID

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

于 2013-04-07T03:56:57.500 回答
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;
}
于 2013-04-10T18:43:43.623 回答
0

首先,确保在设备准备好之后以正确的方式调用requestFileSystem

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

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

于 2013-04-12T08:40:51.683 回答