4

私はAndroid用のCordova(別名Phonegap)を使用して1年以上開発*しており、アプリを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*"/>

私の調査では、エラーがAndroidJellyBeanの時点でGoogleが行った設定変更に関連していることを発見しました。これが私が見つけたものです:From: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" />

targetSdkVersionが16であるのではなく、minSdkVersionを16に変更する必要があるのはなぜですか?

考え?

:現在、Cordova 2.0、Eclipse Indigo SR2(すべての更新が最新)、Android SDK(すべての更新が最新)、Windows 7 Home(すべての更新が最新)、Java 7Update7を使用しています。

4

1 に答える 1

13

さて、たくさんの検索、推測、チェックを行った後、実行可能な解決策を見つけました。

setAllowUniversalAccessFromFileURLs呼び出し用に別の関数を作成する必要がありました...これでTargetApiの問題が修正されましたが、loadURL呼び出しで使用したファイルに接続できない別の関数がJellyBeanに表示されたため、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;
    }
}
于 2012-09-13T19:56:47.390 に答える