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

В WebView есть ли способ toOverrideUrlLoading определить, перехватывает ли он переадресацию или пользователь, нажимая ссылку?

Я бы хотел, чтобы перенаправления происходили естественным образом в WebView и только ловить новый URL-адрес, если это происходит, потому что пользователь что-то нажал.

4b9b3361

Ответ 1

У меня была аналогичная проблема. Мне нужно было открыть страницу в WebView в моей деятельности. Однако, когда пользователи нажимали на ссылку на странице, я хотел, чтобы она открывалась в "новом окне", что означает активность браузера. Это создает проблему, если на странице есть перенаправление. Для этого я сделал следующее:

  • Показывается только просмотр веб-страницы после завершения загрузки страницы.
  • Я продолжаю логическое сообщение, когда страница закончила загрузку. Взаимодействие с пользователем может произойти только после завершения загрузки страницы. в противном случае это перенаправление и должно быть открыто в моей acitivty.

Пример кода:

private boolean mLoaded = false;

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if(mLoaded){ // open in new browser window only if page already finished
        try
        {
            Uri uri = Uri.parse(url);
            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            activity.startActivity(intent);
        }
        catch (Exception e)
        {
            Logger.log(e);
        }
    }
    return true;
}

@Override
public void onPageFinished(WebView webView, String url) {
        layoutHoldingTheWebView.setVisibility(View.VISIBLE);
        mLoaded = true;
    }
}

Ответ 2

Я только что нашел что-то в этом SDK, который мог бы работать, WebView.getHitTestResult() Сообщите мне, если кто-либо видит какие-либо недостатки в этом методе.

Вот пример того, как я его использую:

public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if(view.getHitTestResult().getType() > 0){
         // From a user click, handle it yourself.
         return true;
    } else {
         // Nothing clicked, assumed to be a redirect, let it redirect.
         return false;
    }
}

Ответ 3

Не прямо, нет.

Вы можете использовать комбинацию WebViewClient.onPageStarted и WebView.getOriginalUrl, чтобы попытаться определить, является ли отображаемый url исходным запросом, но это происходит после того, как WebView решил загрузить Url. Это может помочь определить, произошло ли перенаправление, но не будет различать события пользователя и события script, которые не вызывают перенаправления.

Если вы управляете содержимым веб-контента, вы также можете кодировать URL-адреса, доступные для пользователя, определенным образом (например, проприетарную схему вместо http) и выполнять любую дополнительную обработку, которая вам нужна, если критерии соответствуют вашим shouldOverrideUrlLoading.

Ответ 4

Адаптировано из ответа Гаррета, потому что я обнаружил, что он не работает так, как написано, дал несколько ошибок и т.д. И часть видимости на мой взгляд не нужна. У меня была такая же проблема, как и у OP, и это дает поведение, которое я хочу:

webView.setWebViewClient(new WebViewClient()
    {
        private boolean mLoaded = false;
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if(mLoaded){ // open in new browser window only if page already finished
                try
                {
                    Uri uri = Uri.parse(url);
                    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                    view.getContext().startActivity(intent);
                }
                catch (Exception e)
                {
                    Log.d("webview", e.getMessage());
                }
                return true;
            }
            else
            {
                return false;
            }
        }

        @Override
        public void onPageFinished(WebView webView, String url)
        {
            mLoaded = true;
        }
    }

Ответ 5

В SDK 24. может получить результат с помощью нового shouldOverrideUrlLoading(WebView view, WebResourceRequest request),

существует метод isRedirect() в WebResourceRequest, который получает ли запрос в результате перенаправления на стороне сервера.

Ответ 6

Вы можете сделать следующее:

@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url) {
    if (webView.getUrl() != null && webView.getOriginalUrl() != null && webView.getOriginalUrl().equalsIgnoreCase(webView.getUrl()) {
        // Not Redirect
    } else {
        // Redirect
    }
}