Phonegap/Cordova App在Jelly Bean中断 - Access-Control-Allow-Origin和setAllowUniversalAccessFromFileURLs

mas*_*n81 4 java android android-websettings cordova

我一直在用Cordova(aka 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
Run Code Online (Sandbox Code Playgroud)

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

<access origin="*"/>
<access origin="http://127.0.0.1*"/>
Run Code Online (Sandbox Code Playgroud)

在我的研究中,我发现这个错误与Google在Android Jelly Bean中所做的设置更改有关.以下是我发现的内容:来自:https://git-wip-us.apache.org/repos/asf?p = entubator-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);
Run Code Online (Sandbox Code Playgroud)

- 这也来自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);
     }
}
Run Code Online (Sandbox Code Playgroud)

科尔多瓦试图解决这个变化很好,但遗憾的是这不起作用......

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

if(android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
    super.appView.getSettings().setAllowUniversalAccessFromFileURLs(true);    
}
Run Code Online (Sandbox Code Playgroud)

现在我收到以下警告:

Call requires API level 16 (current min is 8) 
android.webkit.WebSettings#setAllowUniversalAccessFromFileURLs
Run Code Online (Sandbox Code Playgroud)

这是我在AndroidManifest.xml中为api所拥有的内容

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" />
Run Code Online (Sandbox Code Playgroud)

为什么要求我将minSdkVersion更改为16而不是跟随我的targetSdkVersion 16?

思考?

注意:我目前正在使用Cordova 2.0,Eclipse Indigo SR2(所有更新当前),Android SDK(所有更新当前版本),Windows 7 Home(所有更新当前版本),Java 7 Update 7.

mas*_*n81 13

好的,经过大量的搜索,猜测和检查,我发现了一个可行的解决方案.

我必须为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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 幸运的是,您不需要在2.1.0中跳过这些箍,因为该版本已经修复了该错误. (3认同)