Android: cómo interceptar un formulario POST en android WebViewClient en el nivel 4 de API
Tengo un WebViewClient
conectado a mi WebView
manera:
webView.setWebViewClient(new MyWebViewClient());
Aquí está mi aplicación de MyWebViewClient
:
- Abrir PDF en un WebView
- Android: EventHub.removeMessages (int what = 107) no es compatible antes de que se configure WebViewCore
- Android WebViewClient onLoadResource () llamada agian después de onPageFinished () cuando targetSdkVersion es 19
- URL de Soundcloud abierta en la aplicación nativa Soundcloud de WebView
- Obtener recursos de WebView que ya se ha descargado
private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { webView.loadUrl(url); return true; } }
Le doy a WebView
una URL para cargar a través de loadUrl()
. Si tengo un enlace ( a href...
) en la página, mi método shouldOverrideUrlLoading
se llama y puedo interceptar el enlace haga 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 la postUrl
de postUrl
en mi WebView
. Sin embargo, esta API sólo está disponible a partir del nivel 5 de la API.
¿Qué puedo hacer si estoy en el nivel 4 de la API? ¿Hay alguna otra forma de interceptar mensajes de formulario?
- Interceptar y anular las solicitudes HTTP de WebView
- WebViewClient.onPageStarted () llamó dos veces al especificar URL no existente a través de WebView.loadURL ()
- Deshabilitar Android WebView / WebViewClient Iniciado favicon.ico Solicitar
- Webview - cambiar la fuente de la página antes de mostrar el sitio web?
- ShouldOverrideUrlLoading se llama SOLAMENTE para ALGUNAS páginas web
- ShouldOverrideUrlLoading (...) no se ejecuta si "window.location.href" modificado en una devolución de llamada de tiempo de espera
- Sube la foto de la cámara y el archivador de archivos desde el campo INPUT de la vista web
- Vista web de Android lanza navegador cuando llama a loadurl
Este es un problema conocido, que shouldOverrideUrlLoading
no captura el POST. Consulte http://code.google.com/p/android/issues/detail?id=9122 para obtener más información.
Utilizar GET! Personalmente he intentado usar POST, porque esperaba alguna limitación de los parámetros GET (es decir longitud de la URL), pero acabo de pasar exitosamente 32000 bytes a través de GET localmente sin ningún problema.
¿Realmente necesitas usar un POST? Si desea manejar formdata localmente, ¿por qué no tener un pedazo de javascript manejar su formulario y la interfaz con el código "nativo" java utilizando 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 cualquier clase básicamente y debería ser capaz de 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 verse así:
<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>
Creo que se puede reemplazar onLoadResource(WebView view, String url)
de WebViewClient
. Esta función se agrega en API NIVEL 1.
Esta función se llama cuando WebView
cargará el recurso especificado por la url dada. Los recursos incluyen js
, css
, iframe
embeded url. 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))); } }
- ArrayIndexOutOfBoundsException cuando se utiliza ListAdapter
- Error de instalación de Adb: INSTALL_CANCELED_BY_USER