gpt4 book ai didi

java - Phonegap/Cordova 应用程序在 Jelly Bean 中中断 - Access-Control-Allow-Origin 和 setAllowUniversalAccessFromFileURLs

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:49 25 4
gpt4 key购买 nike

我已经使用 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

(以及任何后续请求使用 localhost 或 file://的 ajax 的类似错误)只是为了测试,我在 Access-Control-Allow-Origin 部分授予对 config.xml 中所有内容的访问权限

<access origin="*"/>
<access origin="http://127.0.0.1*"/>

在我的research我发现该错误与谷歌对 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);
}
}

很高兴 Cordova 尝试解决这个变化,但不幸的是这不起作用......

在这些 SO 线程中 herehere我找到了一个通用的解决方案,只需按如下方式更改设置:

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 家庭版(所有更新都是最新的)、Java 7 更新7.

最佳答案

好的,经过大量的搜索、猜测和检查,我找到了一个可行的解决方案。

我必须为 setAllowUniversalAccessFromFileURLs 调用创建一个单独的函数...这解决了 TargetApi 问题,但随后在 JellyBean 上出现了一个不同的函数,它无法连接到我在 loadURL 调用中拥有的文件,因此我不得不覆盖onReceivedError 函数。这是我的结果代码:

package com.MyUniqueDomain.MyUniquePackage;

import android.annotation.TargetApi;
import android.os.Bundle;
import org.apache.cordova.*;

public class MainActivity extends DroidGap {

private int retryCount = 0;

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
super.setStringProperty("loadingDialog", "Please wait -- loading...");
super.init();
if(android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
fixJellyBeanIssues();
}
super.loadUrl("file:///android_asset/www/index.html");
}

@TargetApi(16)
protected void fixJellyBeanIssues() {
System.out.println(super.appView.toString());
try {
super.appView.getSettings().setAllowUniversalAccessFromFileURLs(true);
} catch(NullPointerException e) {
System.out.println(e.toString());
}
}

// catch an error and if try again 1x or quit
@Override
public void onReceivedError( int errorCode, String description, String failingUrl)
{
if(retryCount < 3) {
retryCount++;
System.out.println("Connection failed, trying again. Retry Count: "+retryCount);
super.loadUrl("file:///android_asset/www/index.html");
} else {
System.out.println("Sorry, it failed three times so I give up.");
super.loadUrl("file:///android_asset/www/fail.html");
}
return;
}
}

关于java - Phonegap/Cordova 应用程序在 Jelly Bean 中中断 - Access-Control-Allow-Origin 和 setAllowUniversalAccessFromFileURLs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12409440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com