Подтвердить что ты не робот

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

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

Я пытаюсь настроить авторизацию Twitter с помощью OAuth для приложения для Android, и до сих пор я могу успешно отправить пользователя на URL авторизации, однако то, что я пытаюсь сделать сейчас, это перехват перенаправления на обратный вызов ( который просто приведет к ошибке 404, наш URL обратного вызова не будет иметь связанную страницу на наших серверах). То, что я пытаюсь сделать, это проверить, является ли URL-адресом наш обратный вызов, а затем извлечь URL-адрес OAuth Verifier. Я настраиваю свой 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(), если это имеет значение.

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Что я сделал, это переопределить 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 вы поставили бы какой-либо конкретный код, который вы хотите запустить, при обнаружении перенаправления.

Ответ 3

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