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

Android-如何在API级别4上拦截Android WebViewClient中的表单帖子,android,forms,post,webviewclient,Android,Forms,Post,Webviewclient,我的WebView附带了一个WebView客户机,如下所示: webView.setWebViewClient(new MyWebViewClient()); 下面是我对MyWebViewClient的实现: private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) {

我的
WebView
附带了一个
WebView客户机
,如下所示:

webView.setWebViewClient(new MyWebViewClient());
下面是我对MyWebViewClient的实现:

private class MyWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
      webView.loadUrl(url);
      return true;
    }    
}
我通过
loadUrl()
WebView
提供一个要加载的URL。如果我在页面中有一个链接(
a href…
),则调用我的
shouldOverrideUrlLoading
方法,我可以拦截该链接单击

但是,如果我有一个方法为
POST
的表单,则不会调用
shouldOverrideUrlLoading
方法

我在这里注意到了一个类似的问题:它似乎建议在我的
WebView
中覆盖
postUrl
。但是,此API仅从API级别5开始提供


如果我处于API级别4,我可以做什么?还有其他方法可以拦截表单帖子吗?

您真的需要使用帖子吗?如果您想在本地处理formdata,为什么不让一段javascript使用addJavascriptInterface处理您的表单和带有“本机”java代码的接口呢。例如

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>

$(“#按钮”)。单击(函数(){
var a=$(“#a”).val();
var b=$(“#b”).val();
var result=JSON.parse(bridge.doIt(a,b));
// ...
}
点击

这是一个已知的问题,
应该覆盖以下内容
不要捕获帖子。有关详细信息,请参阅


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

我认为您可以覆盖
onLoadResource(WebView视图,字符串URL)
来自
WebViewClient
。此函数在API级别1中添加

WebView
将加载给定url指定的资源时,调用此函数。资源包括
js
css
iframe
嵌入的url。代码示例如下:

    @Override
    public void onLoadResource(WebView view, String url) {
        if (url.indexOf("http://www.example.com") != -1 && view != null) {
            // open url in default browser
            view.stopLoading();
            view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
        }
    }

你可以尝试覆盖WebViewClient中的onPageStarted回调。谢谢。我尝试过了,效果很好,但问题是我不想加载表单的页面-这是一个虚假的URL,因此我最终得到了webview错误页面。我通过在onPageStarted中检查URL是否与我的表单URL匹配来解决这个问题,如果是,请在我的应用程序中处理然后告诉webViewClient返回。这听起来合理吗?您找到解决方案了吗?现在,我们有
WebResourceResponse shouldInterceptRequest(WebView视图,WebResourceRequest)
它确实拦截POST。它仍然不够完美;您不能简单地设置自定义头并让请求继续进行–您必须知道这是理想的解决方案,但不幸的是,它似乎无法在2.3 emulator和该代的各种手机上工作。请查找VM崩溃并出现以下错误:JNI警告:jarray 0x40533560 p指向非数组对象的点(Ljava/lang/String;)谷歌搜索更多信息,我真的需要找到解决方案。因为,在我的情况下,实际上,切换到获取并不在我的手中。我无法理解android中是如何丢失它的。原因是什么。在
webView
中覆盖
postrl
。这是从API级别5开始提供的。我做到了,没有成功。我没有处理。我我还需要一个解决方案。我需要为通过我的WebView发出的所有请求添加一个自定义标题。我首先加载一个重定向的url(通过POST wheee!)到另一个页面,我无法捕获该重定向并正确添加自定义标题。我无法控制服务器以及服务器使用POST而不是GET的事实。在问题中,它被要求拦截POST请求,而不是尝试加载资源。两者都是不同的。对于对此响应添加负数的人:根据HTT根据标准,“资源”不仅仅是文件(js、css等)。“资源”是URI指向的任何东西。例如,API端点也是资源。