shouldOverrideUrlLoading в WebView для Android не работает - PullRequest
21 голосов
/ 18 июля 2011

-Редакт: Решение найдено-
Понял это после некоторого интенсивного поиска - один человек (я буквально имею в виду один) сказал, что вместо этого он использовал onPageLoad ();который отлично работал для моих целей.Разница в том, что onPageLoad () запускается позже, чем shouldOverrideUrlLoading, но в моем коде это не имеет значения.

Я пытаюсь настроить авторизацию Twitter с OAuth для приложения Android, и до сих пор яможет успешно отправить пользователя на URL авторизации, однако сейчас я пытаюсь перехватить переадресацию на обратный вызов (что может привести к ошибке 404, так как на нашем URL обратного вызова не будет связанной страницы на нашем сайте).серверы).То, что я пытаюсь сделать, это проверить, является ли URL нашим обратным вызовом, а затем извлечь OAuth Verifier из URL.Я настраиваю свой WebView с этим кодом:

view = (WebView)findViewById(R.id.twitterWbVw);
view.setWebViewClient(new WebViewClient(){
    @Override
    public boolean shouldOverrideUrlLoading(WebView wView, String url)
    {
        String urlHolder;
        String[] verifExtrctr;
        urlHolder = url.substring(0, url.indexOf('?'));
        System.out.println("url");
        if(urlHolder.equalsIgnoreCase(CALLBACK_URL))
        {
            verifExtrctr = urlHolder.split("?");
            verifExtrctr = verifExtrctr[2].split("=");
            if(verifExtrctr[0].equalsIgnoreCase("oauth_verifier"))
            {
                params[5] = verifExtrctr[1];
                return true;
            }
            else
            {
                System.out.println("Inocorrect callback URL format.");
            }
        }
        else    
        {
            wView.loadUrl(url);
        }
        return true;
    }
});
view.loadUrl(urlAuthorize.toExternalForm());

Дело в том, что даже System.out.println ("url"); (который я использую для отладки) нене бегу! Так что я почти не знаю идей и не могу найти никого с подобной проблемой.URL авторизации проходит нормально, и я могу успешно авторизовать приложение, однако перенаправление на URL обратного вызова по какой-то причине никогда не перехватывается.Буду признателен за любую помощь, это в моем onResume (), если это имеет значение.

Ответы [ 3 ]

51 голосов
/ 19 июля 2011

После некоторых исследований я пришел к выводу, что, несмотря на то, что говорится в большинстве уроков, shouldOverrideUrlLoading() не вызывается, когда:

  1. Вы загружаете URL как

    loadUrl("http://www.google.com");
    
  2. Браузер перенаправляет пользователя автоматически через HTTP Redirect. (см. Комментарий @hmac ниже относительно перенаправлений)

Тем не менее, , вам звонят, когда вы нажимаете на ссылку внутри веб-страницы внутри веб-просмотра. IIRC для авторизации в твиттере использует HTTP Redirect. Облом, было бы полезно, если бы все работало так, как говорят все учебники. Я думаю, что это из очень старой версии Android API ...

Возможно, вы захотите переопределить метод onProgressChanged для WebChromeClient, например, здесь: Как прослушать WebView для завершения загрузки URL? или onPageFinished() метод WebViewClient.

14 голосов
/ 29 февраля 2012

Я нашел разумный способ сделать это благодаря предыдущему ответу и комментариям, указывающим мне правильное направление.

Я переопределил onPageStarted и onPageFinished в пользовательском WebViewClient. Код выглядит примерно так ...

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
  if (pendingUrl == null) {
    pendingUrl = url;
  }
}

@Override
public void onPageFinished(WebView view, String url) {
  if (!url.equals(pendingUrl)) {
    Log.d(TAG, "Detected HTTP redirect " + pendingUrl + "->" + url);
    pendingUrl = null;
  }
}

И, конечно, наряду с Log.d вы бы добавили любой конкретный код, который хотите запустить, при обнаружении перенаправления.

0 голосов
/ 17 мая 2019

Для людей, которые сталкиваются с этим, когда метод shouldOverrideUrlLoading(WebView view, WebResourceRequest request) не вызывается, найдите ваш minSdkVersion.Если вы используете API ниже 24, вы должны использовать shouldOverrideUrlLoading(WebView view, String url).

...