shouldOverrideUrlLoading в WebView для Android не работает

-Редактировать: Решение найдено-
Разобрался после долгих поисков - один человек (я буквально имею в виду одного) сказал, что вместо этого использовали 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 (), если это имеет значение.

21
задан erdemlal 26 November 2013 в 15:49
поделиться

2 ответа

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

  1. Вы загружаете URL-адрес, например

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

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

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

52
ответ дан 29 November 2019 в 06:29
поделиться

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

0
ответ дан 29 November 2019 в 06:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: