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

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

Solutions Collecting From Web of "В WebView есть ли способ, чтобы shouldOverrideUrlLoading определял, перехватывает ли он перенаправление против пользователя, который нажимает ссылку?"

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

  1. Я показываю веб-просмотр только после того, как страница закончила загрузку.
  2. Я продолжаю логическое сообщение, когда страница закончила загрузку. Взаимодействие с пользователем может произойти только после завершения загрузки страницы. В противном случае это перенаправление и должно быть открыто в моей 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; } } 

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

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

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

Я просто нашел что-то в этом 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; } } 

Адаптированный из ответа Гаррета, потому что я обнаружил, что он не работает так, как написано, дал несколько ошибок и т. Д. И часть видимости на мой взгляд не нужна. У меня была такая же проблема, как и у 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; } } 

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

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

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

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