Intereting Posts
Android java lang runtimeexception не может подключиться к службе камеры Анимация для expandableListView Как запустить приложение с Theme.Material на более старых устройствах Relativelayout или LinearLayout в разработке ios iphone? Установите режим наложения Actionbar во время выполнения на Android Как программно удалить журналы вызовов из android? ClassCastException при попытке сделать readParcelable в настраиваемом массиве объектов Центрирование растрового маркера (Google Maps Android API v2) Как определить, находятся ли координаты X и Y внутри моей кнопки? Facebook Android SDK 3.0 всегда возвращает OPENING при входе в систему Java.lang.VerifyError: Ожидание кадра стека в целевой точке 57 Получение аргументов Bundle в обратном вызове onLoadFinished CursorLoader Android (Java) HttpURLConnection отключить повторную попытку в режиме ожидания чтения Как реализовать 2 разных типа разделителей (т. Е. Заголовков) в классе адаптера ListView Преобразование целочисленного значения цвета в RGB

Android – как перехватить форму POST в android WebViewClient на уровне API 4

У меня есть WebViewClient прикрепленный к моему WebView например:

 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 мой метод shouldOverrideUrlLoading и я могу перехватить ссылку.

Однако, если у меня есть форма, метод которой POST , метод shouldOverrideUrlLoading не вызывается.

Я заметил аналогичную проблему здесь: http://code.google.com/p/android/issues/detail?id=9122, которая, кажется, предлагает переопределить postUrl в моем WebView . Однако этот API доступен только начиная с уровня API 5.

Что мне делать, если я на уровне API 4? Есть ли другой способ перехватить сообщения о форме?

Solutions Collecting From Web of "Android – как перехватить форму POST в android WebViewClient на уровне API 4"

Это известная проблема, что shouldOverrideUrlLoading не улавливает POST. Подробнее см. http://code.google.com/p/android/issues/detail?id=9122 .

Используйте GET! Я лично пытался использовать POST, потому что я ожидал некоторого ограничения параметров GET (т.е. длины URL), но я просто успешно передал 32000 байт через GET локально без каких-либо проблем.

Вам действительно нужно использовать POST? Если вы хотите обрабатывать formdata локально, почему бы не использовать часть javascript вашей формы и интерфейса с «родным» Java-кодом, используя addJavascriptInterface. Например

 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> 

Я думаю, что вы можете переопределить onLoadResource(WebView view, String url) из WebViewClient . Эта функция добавлена ​​в API LEVEL 1.

Эта функция вызывается, когда WebView загружает ресурс, указанный данным URL. Ресурс включает js , css , iframe embedded 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))); } }