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

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

  • 如何处理“无限”网页?
  • Android:拦截来自WebView的AJAX调用
  • 如何禁用有时出现在WebView中的缩放控件的提示吐司消息?
  • Android Webview初始缩小
  • Android:拦截来自WebView的AJAX调用
  • Android Webview:有没有办法知道以前的url是什么?
  • 如何在android中的webview中debuggingjavascript
  • 了解Android的webview addjavascriptinterface
  • 我有类似的问题。 我需要在我的活动中打开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 } }