我知道有很多类似的问题,但我真的无法弄清楚这个问题。 我正在使用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