Android - как перехватить форму POST в Android WebViewClient на уровне API 4 - PullRequest
27 голосов
/ 08 сентября 2010

У меня 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, и я могу перехватить щелчок по ссылке.

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

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

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

Ответы [ 3 ]

3 голосов
/ 19 июля 2012

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

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

2 голосов
/ 13 октября 2010

Вам действительно нужно использовать POST?Если вы хотите обрабатывать формданные локально, почему бы не сделать так, чтобы кусок 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>
0 голосов
/ 05 сентября 2014

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

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