一年多来,我一直在使用 Cordova(又名 Phonegap)为 Android 开发*,并试图让我的应用程序可以在 Jelly Bean 中运行,但我收到以下错误:
XMLHttpRequest cannot load http://127.0.0.1:40582/[somerandomstring]. Origin null is not allowed by Access-Control-Allow-Origin. at null:1
(以及任何后续 ajax 请求使用 localhost 或 file:// 的类似错误)只是为了测试,我授予对 Access-Control-Allow-Origin 部分中 config.xml 中所有内容的访问权限
<access origin="*"/>
<access origin="http://127.0.0.1*"/>
在我的研究中,我发现该错误与 Google 对 Android Jelly Bean 所做的设置更改有关。这是我发现的:来自:https ://git-wip-us.apache.org/repos/asf?p=incubator-cordova-android.git;a=commitdiff;h=07439ff9
-- 这是来自 org.apache.cordova.CordovaWebView
// Jellybean rightfully tried to lock this down. Too bad they didn't give us a whitelist
// while we do this
if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
Level16Apis.enableUniversalAccess(settings);
-- 这也是来自 org.apache.cordova.CordovaWebView
// Wrapping these functions in their own class prevents warnings in adb like:
// VFY: unable to resolve virtual method 285: Landroid/webkit/WebSettings;.setAllowUniversalAccessFromFileURLs
@TargetApi(16)
private static class Level16Apis {
static void enableUniversalAccess(WebSettings settings) {
settings.setAllowUniversalAccessFromFileURLs(true);
}
}
很高兴科尔多瓦试图解决这个变化,但不幸的是这不起作用......
在此处和此处的这些 SO 线程中,我找到了一个常见的解决方案,只需按如下方式更改设置:
if(android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
super.appView.getSettings().setAllowUniversalAccessFromFileURLs(true);
}
现在我收到以下警告:
Call requires API level 16 (current min is 8)
android.webkit.WebSettings#setAllowUniversalAccessFromFileURLs
这是我的 AndroidManifest.xml 中的 api
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" />
为什么要求我将 minSdkVersion 更改为 16 而不是遵循我的 targetSdkVersion 16?
想法?
注意:我目前正在使用 Cordova 2.0、Eclipse Indigo SR2(所有更新当前)、Android SDK(所有更新当前)、Windows 7 Home(所有更新当前)、Java 7 Update 7。