web-dev-qa-db-ja.com

Android-フォームをインターセプトする方法POST in Android WebViewClient on API level 4

私はWebViewClientWebViewに次のように添付しています:

_webView.setWebViewClient(new MyWebViewClient());
_

これがMyWebViewClientの私の実装です:

_private class MyWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
      webView.loadUrl(url);
      return true;
    }    
}
_

WebViewloadUrl()を介してロードするURLを指定します。ページにリンク(_a href..._)がある場合、shouldOverrideUrlLoadingメソッドが呼び出され、リンクのクリックをインターセプトできます。

ただし、メソッドがPOSTのフォームがある場合、shouldOverrideUrlLoadingメソッドは呼び出されません。

ここで同様の問題に気づきました: http://code.google.com/p/Android/issues/detail?id=9122postUrlを上書きすることを提案しているようですWebView。ただし、このAPIはAPIレベル5以降でのみ使用できます。

APIレベル4の場合はどうすればよいですか?フォームの投稿を傍受する方法は他にありますか?

28
manisha

これは既知の問題であり、shouldOverrideUrlLoadingがPOSTをキャッチしません。詳細は http://code.google.com/p/Android/issues/detail?id=9122 を参照してください。

GETを使用してください! GETパラメータの制限(URLの長さなど)を期待していたため、個人的にPOSTを使用してみましたが、問題なくローカルでGETを介して32000バイトを正常に渡しただけです。

4
Mike Keskinov

本当にPOSTを使用する必要がありますか? formdataをローカルで処理したい場合は、JavaScriptでフォームを処理し、「ネイティブ」のインターフェースを使用しないでくださいJava addJavascriptInterfaceを使用したコード。

WebView engine = (WebView) findViewById(R.id.web_engine);       
engine.getSettings().setJavaScriptEnabled(true); 
engine.addJavascriptInterface(new MyBridge(this), "bridge");
engine.loadUrl(...)

ブリッジは基本的に任意のクラスにすることができ、JavaScriptから直接そのメソッドにアクセスできるはずです。例えば。

public class MyBridge {

    public MyBridge(Context context) {
         // ...
    }

    public String doIt(String a, String b) {
            JSONArray result = new JSONArray();
            result.put("Hello " + a);
            result.put("Hello " + b);
            return result.toString();       
    }

あなたのhtml/javascriptは次のようになります:

<script type="text/javascript">
    $("#button").click(function() {
        var a = $("#a").val();
        var b = $("#b").val();

        var result=JSON.parse(bridge.doIt(a, b));
        // ...
    }
</script>

<input id="a"><input id="b"><button id="button">click</button>
3