Android - 如何在API级别4上拦截android WebViewClient中的表单POST

man*_*sha 28 forms post android webviewclient

我有这样的WebViewClient依恋WebView:

webView.setWebViewClient(new MyWebViewClient());
Run Code Online (Sandbox Code Playgroud)

这是我的实现MyWebViewClient:

private class MyWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
      webView.loadUrl(url);
      return true;
    }    
}
Run Code Online (Sandbox Code Playgroud)

我给了WebView一个URL来加载via loadUrl().如果我a href...在页面中有一个link(),我的shouldOverrideUrlLoading方法被调用,我可以拦截链接点击.

但是,如果我有一个方法的表单,则不调用POSTshouldOverrideUrlLoading方法.

我在这里注意到了一个类似的问题:http://code.google.com/p/android/issues/detail?id = 9122这似乎建议覆盖postUrl我的WebView.但是,此API仅从API级别5开始提供.

如果我在API级别4,我该怎么办?有没有其他方法来拦截表格帖子?

Ivo*_*ijk 5

你真的需要使用POST吗?如果您想在本地处理表单数据,为什么不让一段 javascript 使用 addJavascriptInterface 来处理您的表单和带有“本机”java 代码的界面。例如

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

您的网桥基本上可以是任何类,您应该能够直接从 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();       
    }
Run Code Online (Sandbox Code Playgroud)

您的 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>
Run Code Online (Sandbox Code Playgroud)


Mik*_*nov 5

这是已知问题,shouldOverrideUrlLoading无法捕获 POST。有关详细信息,请参阅http://code.google.com/p/android/issues/detail?id=9122

使用获取!我个人尝试过使用 POST,因为我预计 GET 参数(即 URL 的长度)会受到一些限制,但我刚刚在本地成功通过 GET 传递了 32000 字节,没有任何问题。

  • 我真的需要找到解决方案。因为,就我而言,实际上,切换到 GET 并不在我手中。我无法理解 android 中如何错过它。到底是什么原因呢。 (7认同)
  • 我也需要一个解决方案。我需要向通过 WebView 发出的所有请求添加自定义标头。我首先加载一个重定向(通过 POST wheee!)到另一个页面的 URL,但我无法捕获该重定向并正确添加自定义标头。我无法控制服务器,而且它使用的是 POST 而不是 GET。 (7认同)
  • 我做了,没有成功。不处理。 (2认同)