在WebView中,有没有办法让shouldOverrideUrlLoading确定它是否正在捕获重定向而不是用户单击链接?

我想允许重定向在WebView中自然发生,并且只有在用户点击某些内容时才会发现新的URL。

我有类似的问题。 我需要在我的活动中打开WebView中的页面。 但是,当用户点击页面中的链接时,我希望它在“新窗口”中打开,这意味着浏览器活动。 如果页面具有重定向,则会出现问题。 为了实现这一目标,我做了以下事情:

  1. 我只在页面加载完成后才显示webview。
  2. 我保留一个布尔告诉我页面何时加载完毕。 用户交互只能在页面加载完成后发生。 否则它是一个重定向,应该在我的活动中打开。

代码示例:

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; } } 

我刚刚在SDK中find了可能有用的东西, 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; } } 

不直接,没有。

您可以使用WebViewClient.onPageStartedWebView.getOriginalUrl的组合来尝试确定正在显示的URL是否是所请求的原始URL,但这是 WebView决定加载Url之后。 这可以帮助确定是否发生了重定向,但仍然无法区分用户事件和不会导致重定向的脚本事件。

如果您控制Web内容的内容,您还可以以某种可识别的方式对用户可单击的Url进行编码(例如,专有方案而不是http),并在您的shouldOverrideUrlLoading实现中的条件匹配时执行您需要的任何其他处理。

在SDK 24.中可以通过新的shouldOverrideUrlLoading(WebView view, WebResourceRequest request)获取结果,

WebResourceRequest中有一个方法isRedirect() ,它获取请求是否是服务器端重定向的结果。

改编自Garrett的答案,因为我发现它并没有像书面那样工作,给出了一些错误等。而且我认为不需要关于可见性的部分。 我有与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; } } 

你可以这样做:

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