2010-09-08 9 views
25

Tengo un WebViewClient unido a mi WebView así:Android - Procedimiento para interceptar un POST forma en WebViewClient androide en el nivel API 4

webView.setWebViewClient(new MyWebViewClient()); 

Aquí es mi implementación de MyWebViewClient:

private class MyWebViewClient extends WebViewClient { 

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

Doy el WebView una URL para cargar a través del loadUrl(). Si tengo un enlace (a href...) en la página, mi método shouldOverrideUrlLoading se llama y me puede interceptar el enlace de clic.

Sin embargo, si tengo un formulario cuyo método es POST, no se llama al método shouldOverrideUrlLoading.

Me di cuenta de un problema similar aquí: http://code.google.com/p/android/issues/detail?id=9122 que parece sugerir el reemplazo postUrl en mi WebView. Sin embargo, esta API sólo está disponible a partir del nivel de la API 5.

¿Qué puedo hacer si estoy en el nivel API 4? ¿Hay alguna otra forma de interceptar publicaciones de formularios?

+0

Puede intentar anular la devolución de llamada iniciada por página en WebViewClient. – bhups

+0

Gracias. Intenté eso y funciona bien, pero el problema es que no quiero cargar la página del formulario, es una URL falsa, así que termino obteniendo la página de error de webview. Estuve solucionando esto al registrar en la página Inicio de página si la URL coincide con la URL de mi formulario, y si es así, manejar esto en mi aplicación y luego decirle al webViewClient que vuelva. ¿Eso suena razonable? – manisha

+0

¿Encontró una solución a esto? – Sohaib

Respuesta

3

Esto se conoce tema, que no debe quedar atrapado shouldOverrideUrlLoading POST. Ver http://code.google.com/p/android/issues/detail?id=9122 para más detalles.

usar GET! Personalmente traté de usar POST, porque esperaba alguna limitación de los parámetros GET (es decir, la longitud de la URL), pero pasé con éxito 32000 bytes a través de GET localmente sin ningún problema.

+0

Realmente necesito encontrar la solución a esto. Porque, en mi caso, no está en mis manos cambiar a GET, en realidad. No puedo entender cómo se pierde en Android. Cuál fue la razón. – boburShox

+0

Reemplazar 'postUrl' en' webView'. Esto está disponible desde el nivel de API 5. –

+0

Lo hice, no tuve éxito. No manejando. – boburShox

2

¿Usted realmente necesita utilizar un POST? Si desea manejar formdata localmente, ¿por qué no tener una pieza de javascript que maneja su formulario e interfaz con el código java "nativo" usando addJavascriptInterface? P.ej.

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

Su puente puede ser de cualquier clase, básicamente, y debe poder acceder a sus métodos directamente desde javascript. P.ej.

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

su HTML/Javascript podría parecerse a:

<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

Esa es la solución ideal, pero desafortunadamente no parece funcionar en el emulador 2.3 y varios teléfonos de esa generación.Busque bloqueos de máquina virtual con el siguiente error: JNI ADVERTENCIA: jarray 0x40533560 apunta a un objeto que no es de matriz (Ljava/lang/String;) Google para obtener más información – EtienneSky

-2

Creo que se puede anular onLoadResource(WebView view, String url) de WebViewClient. Esta función se agrega en API LEVEL 1.

Se llama a esta función cuando WebView cargará el recurso especificado por la url dada. Recursos incluyen js, css, iframe url Embebido. Ejemplo de código como este:

@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

En la pregunta se solicita que intercepte la solicitud POST que no intenta la carga de recursos. Ambos son diferentes. – Gem

+0

Para aquellos que agregan menos a esta respuesta: según el estándar HTTP, "recurso" no es solo archivo (js, css, etc.). "Recurso" es algo a lo que URI apunta. Por ejemplo, los puntos finales API también son recursos. – forallepsilon

Cuestiones relacionadas