7

リモートサーバーに ajax リクエストを行う jquerymobile を使用して、javascript/HTML アプリケーションを開発しています。アプリケーションは Chrome (Web セキュリティを無効にして Chrome を起動する場合のみ) で正常に動作しますが、Android アプリケーション (単純な Web ビュー) の assets/ ディレクトリに埋め込むと、リモート ajax 呼び出しが失敗します。したがって、クロスドメインの問題である可能性があると思います。phonegap にはこの問題がないことは承知していますが、可能であれば phonegap を使用したくありません。問題は、Android WebView アプリケーションでクロス ドメイン保護を無効にするにはどうすればよいかということです。

これはアクティビティ コードです。

public class Moby extends Activity {

@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_moby);

    WebView mbrowser = (WebView) findViewById(R.id.webView1); //get the WebView from the layout XML
    if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) 
        mbrowser.getSettings().setAllowUniversalAccessFromFileURLs(true);
    //mbrowser.setWebChromeClient(new WebChromeClient());
    mbrowser.setWebViewClient(new WebViewClient());
    mbrowser.loadUrl("file:///android_asset/index.html"); //set the HTML
    WebSettings settings = mbrowser.getSettings();
    settings.setJavaScriptEnabled(true);
}

}

<uses-permission android:name="android.permission.INTERNET" />

そして、私はすでにHTMLページでjquerymobileクロスドメインパラメータを設定しています:

<script src="script/jquery-1.8.2.js"></script>
<script>
 $(document).bind("mobileinit", function(){
 $.support.cors = true;
 $.mobile.allowCrossDomainPages = true;       
}); 
</script>
<script src="script/jquery.mobile-1.2.0.js"></script>
4

4 に答える 4

5

これをコメントとして投稿するには十分なポイントがありませんが、以下をご覧ください。

ajax は一部の Android デバイスで動作しますが、他のデバイスでは動作しません

具体的には、Chrome ベースの webView では以下が必要です。

webView.getSettings().setAllowUniversalAccessFromFileURLs(true);

編集:申し訳ありませんが、あなたがすでにこれを行っているのを見ました-私はこれを私の側でテストしましたが、問題が解決したようです(ajax経由でローカルリンクをロードするときにアクセス制御許可オリジンエラーが発生していました)。

于 2015-01-12T13:42:21.363 に答える
1

同じ問題があり、WebViewClient で shouldInterceptRequest をオーバーライドして修正しました。私は ajax 呼び出しをインターセプトし、Java で実行します。POST メソッドについても同じことを行う必要があります

private class MyWebViewClient extends WebViewClient {
        @Override
        public void onPageFinished(WebView webView, String url) {
            Log.d("test", "onPageFinished");
            loadWebViewJavascriptBridgeJs(webView);
        }

        @Override
        public WebResourceResponse shouldInterceptRequest(WebView webview, WebResourceRequest webrequest)
        {
            Log.d("test", "shouldInterceptRequest");
           return this.handleRequest(webrequest.getUrl().toString());
        }

        @NonNull
        private WebResourceResponse handleRequest(@NonNull String urlString) {
            try {
                URL url = new URL(urlString);
                HttpURLConnection connection = (HttpURLConnection)url.openConnection();
                connection.setRequestProperty("User-Agent", "");
                connection.setRequestMethod("GET");
                connection.setDoInput(true);
                connection.connect();

                InputStream inputStream = connection.getInputStream();
                return new WebResourceResponse("text/json", "utf-8", inputStream);
            } catch (MalformedURLException e) {
                e.printStackTrace();
                return null;
            }
            catch (ProtocolException e) {
                e.printStackTrace();
                return null;
            }catch (IOException e) {
                e.printStackTrace();
                return null;
            }

        }
    }

WebView を起動するとき、WebViewClient をインスタンス化します

 mWebView.setWebViewClient(new MyWebViewClient());
于 2016-04-15T07:33:48.003 に答える
-1

AndroidManifest.xml に次の行がありますか。

<uses-permission android:name="android.permission.INTERNET" />
于 2012-12-19T16:33:55.293 に答える