2010-09-08 18 views
25

Ho un WebViewClient attaccato al mio WebView in questo modo:Android - come intercettare una forma POST in WebViewClient Android sul livello di API 4

webView.setWebViewClient(new MyWebViewClient()); 

Qui è la mia realizzazione di MyWebViewClient:

private class MyWebViewClient extends WebViewClient { 

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

Fornisco a WebView un URL da caricare tramite loadUrl(). Se ho un collegamento (a href...) nella pagina, il mio metodo shouldOverrideUrlLoading viene chiamato e posso intercettare il clic del collegamento.

Tuttavia, se si dispone di un modulo il cui metodo è POST, il metodo shouldOverrideUrlLoading non viene chiamato.

Ho notato un problema simile qui: http://code.google.com/p/android/issues/detail?id=9122 che sembra suggerire di ignorare postUrl nel mio WebView. Tuttavia, questa API è disponibile solo a partire dal livello API 5.

Cosa posso fare se sono al livello API 4? C'è un altro modo per intercettare i messaggi di forma?

+0

È possibile provare a eseguire l'override del callbackPageStarted in WebViewClient. – bhups

+0

Grazie. L'ho provato e funziona, ma il problema è che non voglio caricare la pagina del modulo: è un URL falso, quindi alla fine ottengo la pagina di errore della pagina web. Ho lavorato a questo problema collegando onPageStarted se l'URL corrisponde all'URL del mio modulo e, in tal caso, gestirlo nella mia app e poi dire a webViewClient di tornare indietro. Suona ragionevole? – manisha

+0

Hai trovato una soluzione a questo? – Sohaib

risposta

3

Questo è noto problema, che shouldOverrideUrlLoading non cattura POST. Vedi http://code.google.com/p/android/issues/detail?id=9122 per i dettagli.

Utilizzare GET! Ho provato personalmente a utilizzare il POST, perché mi aspettavo qualche limitazione dei parametri GET (cioè la lunghezza dell'URL), ma ho appena superato con successo 32000 byte tramite GET localmente senza problemi.

+0

Ho davvero bisogno di trovare la soluzione a questo. Perché, nel mio caso, non è nelle mie mani passare a GET, in realtà. Non riesco a capire come sia mancato in Android. Qual è stata la ragione. – boburShox

+0

Sovrascrivi 'postUrl' in' webView'. Questo è disponibile dal livello API 5. –

+0

, non ho avuto successo. Non maneggiando – boburShox

2

Hai davvero bisogno di usare un POST? Se vuoi gestire i formdata localmente, perché non avere un pezzo di javascript gestisci il tuo modulo e interfaccia con il codice java "nativo" usando addJavascriptInterface. Per esempio.

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

vostro ponte può essere qualsiasi classe fondamentalmente e si dovrebbe essere in grado di accedere ai suoi metodi direttamente da JavaScript. Per esempio.

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();  
    } 

tuo html/javascript potrebbe apparire come:

<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

Questa è la soluzione ideale ma sfortunatamente non sembra funzionare sull'emulatore 2.3 e sui vari telefoni di quella generazione.Cerca VM arresti anomali con il seguente errore: AVVISO JNI: jarray 0x40533560 punta a un oggetto non array (Ljava/lang/String;) Google per quello per ulteriori informazioni – EtienneSky

-2

Penso che è possibile ignorare onLoadResource(WebView view, String url) da WebViewClient. Questa funzione è aggiunta in API LEVEL 1.

Questa funzione viene richiamata quando WebView carica la risorsa specificata dall'URL specificato. La risorsa include js, css, iframe URL incorporato. Esempio di codice come questo:

@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

Nella domanda viene chiesto di intercettare la richiesta POST non tentando il caricamento delle risorse. Entrambi sono diversi. – Gem

+0

Per coloro che aggiungono aspetti negativi a questa risposta: secondo lo standard HTTP, "risorsa" non è solo il file (js, css e così via). "Risorsa" è qualcosa a cui punta l'URI. Ad esempio, gli endpoint API sono anche risorse. – forallepsilon

Problemi correlati