在WebView中,shouldOverrideUrlLoading是否有一种方法来确定是否捕获redirect,而不是用户单击链接?

我想允许redirect在WebView中自然发生,并且只有在用户点击某个东西时发生,才会捕获新的url。

Solutions Collecting From Web of "在WebView中,shouldOverrideUrlLoading是否有一种方法来确定是否捕获redirect,而不是用户单击链接?"

我有一个类似的问题。 我需要在我的活动中的WebView中打开一个页面。 但是,当用户点击页面中的链接时,我想让它在“新窗口”中打开,这意味着浏览器的活动。 如果页面有redirect,则会出现问题。 为了做到这一点,我做了以下工作:

  1. 一旦页面加载完成,我只显示webview。
  2. 我保持一个布尔值告诉我,当页面完成加载。 用户交互只能在页面加载完成后才能发生。 否则它是一个redirect,应该打开我的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; } } 

我刚刚在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是否是原始请求,但是这是 WebView决定加载Url之后。 这可以帮助确定是否发生了redirect,但仍然不能区分用户事件和不会导致redirect的脚本事件。

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

从Garrett的答案改编,因为我发现它没有像书面的工作,给了一些错误等。关于知名度的部分在我看来是不需要的。 我有完全相同的问题,这是给予我想要的行为:

 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.可以通过新的shouldOverrideUrlLoading(WebView view, WebResourceRequest request)获得结果,

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

你可以做如下:

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