2010-09-08 53 views
25

我附上一個WebViewClientWebView像這樣:Android的 - 如何攔截安卓WebViewClient表單POST的API級別4

webView.setWebViewClient(new MyWebViewClient()); 

這是我實現的MyWebViewClient

private class MyWebViewClient extends WebViewClient { 

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

我給WebView一個URL加載通過loadUrl()。如果我在頁面中有一個鏈接(a href...),我的shouldOverrideUrlLoading方法被調用,我可以攔截鏈接點擊。

但是,如果我有一個表格的方法是POST,則不會調用shouldOverrideUrlLoading方法。

我注意到類似的問題在這裏:http://code.google.com/p/android/issues/detail?id=9122這似乎建議覆蓋postUrl在我的WebView。但是,此API僅可從API級別5開始使用。

如果我在API級別4上,該怎麼辦?有沒有其他方法來攔截表單帖子?

+0

您可以嘗試覆蓋WebViewClient中的onPageStarted回調。 – bhups 2010-09-08 03:27:26

+0

謝謝。我試過了,它工作正常,但問題是我不希望窗體的頁面加載 - 這是一個假的URL,所以我最終得到的Web視圖錯誤頁面。我通過檢查onPageStarted來解決這個問題,如果URL匹配我的表單URL,如果是的話,在我的應用程序中處理這個,然後告訴webViewClient返回。這聽起來合理嗎? – manisha 2010-09-09 17:07:20

+0

您是否找到解決方案? – Sohaib 2015-03-31 10:54:42

回答

3

這是已知的問題,即shouldOverrideUrlLoading不抓POST。詳情請參閱http://code.google.com/p/android/issues/detail?id=9122

使用GET!我個人嘗試使用POST,因爲我期望GET參數有一些限制(即URL的長度),但是我通過GET在本地成功傳遞了32000字節,沒有任何問題。

+0

我真的需要找到解決方案。因爲,就我而言,實際上,切換到GET並不在我的手中。我無法理解它是如何在android中錯過的。原因是什麼? – boburShox 2013-03-13 11:57:39

+0

覆蓋'webView'中的'postUrl'。這是自API級別5後可用。 – 2013-03-13 17:23:31

+0

我做到了,沒有成功。不處理。 – boburShox 2013-03-14 03:51:21

2

你真的需要使用POST嗎?如果你想在本地處理formdata,爲什麼不用一段JavaScript處理你的窗體,並使用addJavascriptInterface與「native」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> 
+0

這是理想的解決方案,但不幸的是似乎不適用於2.3代仿真器和那一代的各種手機。查找具有以下錯誤的虛擬機崩潰:JNI警告:jarray 0x40533560指向非數組對象(Ljava/lang/String;)Google for that for more information – EtienneSky 2012-01-30 07:05:42

-2

我認爲你可以覆蓋WebViewClientonLoadResource(WebView view, String url)。此功能在API級別1中添加。

WebView將加載由給定url指定的資源時,將調用此函數。資源包括jscssiframe嵌入式網址。代碼示例如下:

@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))); 
     } 
    } 
+0

在問題中,它被要求攔截POST請求而不是嘗試資源加載。兩者都不同。 – Gem 2015-10-23 06:39:08

+0

對於那些對此響應增加了負面影響的人:根據HTTP標準,「資源」不僅僅是文件(js,css等)。 「資源」是URI指向的任何東西。例如,API端點也是資源。 – forallepsilon 2017-08-31 13:53:41