使用PhoneGap创建文件时的ENCODING_ERR

时间:2014-10-21 07:48:47

标签: java javascript android cordova file-io

我知道有很多类似的问题,但我真的无法弄清楚这个问题。 我正在使用AppPresser作为Wordpress插件/主题来“appify”现有的WP博客。这使用PhoneGap将博客与设备连接起来。我的Cordova安装版本是3.6.3-0.2.13。 我在设备上创建一个简单的文件时遇到了麻烦。我正在使用Cordova File API来完成这件事。我正在使用的File API版本是1.1.1-dev(AppPresser提供的PhoneGap版本附带已经设置的基本插件)。 我的Javascript文件如下:

window.requestFileSystem(window.LocalFileSystem.PERSISTENT, 0, gotFS, fail1);

function gotFS(fileSystem) {
    fileSystem.root.getFile( "dummy.html", {create: true, exclusive: false}, gotFileEntry, fail2);
}

function gotFileEntry(fileEntry) {
    alert("Got file Entry!!");
}

function fail1(e) {
    console.log("fail1: "+e);
}    
function fail2(e) {
    console.log(e);
    var msg = '';
    switch ( e.code ) {
        case FileError.ENCODING_ERR:
            msg = 'ENCODING_ERR';
            break;
        case FileError.INVALID_MODIFICATION_ERR:
            msg = 'INVALID_MODIFICATION_ERR';
            break;
        case FileError.INVALID_STATE_ERR:
            msg = 'INVALID_STATE_ERR';
            break;
        case FileError.NO_MODIFICATION_ALLOWED_ERR:
            msg = 'NO_MODIFICATION_ALLOWED_ERR';
            break;
        case FileError.NOT_FOUND_ERR:
            msg = 'NOT_FOUND_ERR';
            break;
        case FileError.NOT_READABLE_ERR:
            msg = 'NOT_READABLE_ERR';
            break;
        case FileError.PATH_EXISTS_ERR:
            msg = 'PATH_EXISTS_ERR';
            break;
        case FileError.QUOTA_EXCEEDED_ERR:
            msg = 'QUOTA_EXCEEDED_ERR';
            break;
        case FileError.SECURITY_ERR:
            msg = 'SECURITY_ERR';
            break;
        case FileError.TYPE_MISMATCH_ERR:
            msg = 'TYPE_MISMATCH_ERR';
            break;
        default:
            msg = 'Unknown Error';
            break;
    };
    alert( 'Error: ' + msg );
}

函数fileSystem.root.getFile失败(调用fail2),错误为FileError.ENCODING_ERR。请注意,我不等待应用程序触发onDeviceReady事件,因为在用户在页面中执行了许多操作后调用了window.requestFileSystem。我主要测试我的LG Nexus 4,但错误也发生在我的iOS模拟器中。 我做了一堆调试。 cordova.js中的核心错误是在调用本机服务时:

 var messages = nativeApiProvider.get().exec(service, action, callbackId, argsJson);

var messages为null。因此,我对本机Android应用程序进行了一些调试,原生例外是:

java.net.MalformedURLException: No installed handlers for this URL

受影响的方法在FileUtils.java类中:

private JSONObject getFile(String baseURLstr, String path, JSONObject options, boolean directory) throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException {
    try {
        LocalFilesystemURL inputURL = new LocalFilesystemURL(baseURLstr);
        Filesystem fs = this.filesystemForURL(inputURL);
        if (fs == null) {
            throw new MalformedURLException("No installed handlers for this URL");
        }
        return fs.getFileForLocalURL(inputURL, path, options, directory);

    } catch (IllegalArgumentException e) {
        throw new MalformedURLException("Unrecognized filesystem URL");
    }

}

在此方法中,this.filesystemForURL(inputURL)返回null。 方法参数是:baseURLstr =“/”,path =“dummy.html”,options ='{“create”:true,“exclusive”:false}',boolean directory = false。 LocalFilesystemURL inputURL get等于cdvfile:// localhost / nullnull。 这意味着LocalFileSystemURL对象中的fileSystemName和fullPath变量都为null。因此,this.filesystemForURL(inputURL)get等于nulland异常被触发。问题在于类构造函数:

public LocalFilesystemURL(Uri URL) {
    this.URL = URL;
    this.filesystemName = this.filesystemNameForLocalURL(URL);
    this.fullPath = this.fullPathForLocalURL(URL);
}

URL为“/”,this.filesystemNameForLocalURL(URL)和this.fullPathForLocalURL(URL)都返回null。 这是例如fileSystemNameForLocalURL方法:

private String filesystemNameForLocalURL(Uri URL) {
    if (FILESYSTEM_PROTOCOL.equals(URL.getScheme()) && "localhost".equals(URL.getHost())) {
        List<String> pathComponents = URL.getPathSegments();
        if (pathComponents != null && pathComponents.size() > 0) {
            return pathComponents.get(0);
        }
        return null;
    } else if ("content".equals(URL.getScheme())) {
        return "content";
    }
    return null;
}

显然返回null,因为URL是“/”。所以问题可能在于JavaScript函数传递的baseURLstr。 你能提供一些提示吗?

非常感谢,Roberto

0 个答案:

没有答案