【问题标题】:shouldOverrideUrlLoading in WebView for Android not runningAndroid 的 WebView 中的 shouldOverrideUrlLoading 未运行
【发布时间】:2011-10-07 23:24:41
【问题描述】:

-编辑:找到解决方案-
经过一番繁重的搜索后弄清楚了 - 一个人(我的意思是一个人)说他们改为使用 onPageLoad();这非常适合我的目的。不同之处在于 onPageLoad() 比 shouldOverrideUrlLoading 运行得晚,但它对我的代码没有影响。

我正在尝试使用 OAuth 为 Android 应用程序设置 Twitter 授权,到目前为止,我可以成功地将用户发送到授权 URL,但是,我现在要做的是拦截重定向到回调 (这只会导致 404 错误,我们的回调 URL 不会在我们的服务器上有关联的页面)。我试图做的是检查 URL 是否是我们的回调,然后从 URL 中提取 OAuth 验证器。我用这段代码设置了我的 WebView:

view = (WebView)findViewById(R.id.twitterWbVw);
view.setWebViewClient(new WebViewClient(){
    @Override
    public boolean shouldOverrideUrlLoading(WebView wView, String url)
    {
        String urlHolder;
        String[] verifExtrctr;
        urlHolder = url.substring(0, url.indexOf('?'));
        System.out.println("url");
        if(urlHolder.equalsIgnoreCase(CALLBACK_URL))
        {
            verifExtrctr = urlHolder.split("?");
            verifExtrctr = verifExtrctr[2].split("=");
            if(verifExtrctr[0].equalsIgnoreCase("oauth_verifier"))
            {
                params[5] = verifExtrctr[1];
                return true;
            }
            else
            {
                System.out.println("Inocorrect callback URL format.");
            }
        }
        else    
        {
            wView.loadUrl(url);
        }
        return true;
    }
});
view.loadUrl(urlAuthorize.toExternalForm());

事情是甚至 System.out.println("url");(我用来调试的)不运行!所以我很漂亮想法很枯燥,找不到有类似问题的人。授权 URL 正常,我可以成功授权应用程序,但是由于某种原因重定向到回调 URL 永远不会被拦截。任何帮助将不胜感激,如果这很重要,这在我的 onResume() 中。

【问题讨论】:

  • 您确定 shouldOverrideUrlLoading 是您想要覆盖的正确方法吗?
  • 我很确定 - 据我所知,每次加载 URL 时它都会运行
  • 好吧,如果 System.out.println("url"); 没有运行,我可能会再次检查您是否覆盖了正确的方法
  • 我一直在环顾四周,它似乎就是我要找的东西。我找不到有类似问题的人;如果这个方法在大多数情况下的问题是每次加载 URL 时都会运行。
  • 我在模拟器上遇到了同样的问题,但在真实设备上却没有。很奇怪。

标签: android https android-webview webviewclient


【解决方案1】:

经过一些研究,我得出结论,尽管大多数教程都这么说,shouldOverrideUrlLoading() 在以下情况下不会被调用:

  1. 你加载一个像

    这样的 URL
    loadUrl("http://www.google.com");
    
  2. 浏览器通过 HTTP 重定向自动重定向用户。 (请参阅下面@hmac 关于重定向的评论)

它确实,当您单击 web 视图内的网页内的链接时会被调用。 IIRC twitter 授权使用 HTTP 重定向.. 太糟糕了,如果它像所有教程所说的那样工作,这将很有帮助。我认为这是来自一个非常旧版本的 Android API...

您可能需要考虑覆盖WebChromeClientonProgressChanged 方法,如下所示:How to listen for a WebView finishing loading a URL? WebViewClientonPageFinished() 方法。

【讨论】:

  • 啊,谢谢。如果有的话,我会使用前者,因为回调只会显示 404 错误屏幕,我宁愿不让它完成加载页面。非常感谢。
  • OnPageFinished 对我来说并不可靠,但 onProgressChanged 可以。我通过打印出带有 onPageFinished 进度的日志消息对此进行了测试,并注意到调用 onPageFinished 时进度并不总是 100。根据关于onPageFinished的android文档,“这个方法只对主框架调用”,所以我认为使用这个方法来知道页面是否真的完全加载是不可靠的。
  • re 2. API 24 方法改变了这一点:shouldOverrideUrlLoading(WebView view, WebResourceRequest request) 也被称为重定向,但 request.isRedirect() 您可以随意控制
【解决方案2】:

感谢之前的回答和 cmets 为我指明了正确的方向,我找到了我认为合理的方法。

我所做的是在自定义 WebViewClient 中覆盖 onPageStarted 和 onPageFinished。 代码是这样的......

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
  if (pendingUrl == null) {
    pendingUrl = url;
  }
}

@Override
public void onPageFinished(WebView view, String url) {
  if (!url.equals(pendingUrl)) {
    Log.d(TAG, "Detected HTTP redirect " + pendingUrl + "->" + url);
    pendingUrl = null;
  }
}

当然,除了 Log.d 之外,您还可以在检测到重定向时放置您想要运行的任何特定代码。

【讨论】:

  • 这些是自定义 WebViewClient 的功能,而不是 WebChromeClient 的功能,以防万一有人偶然发现
  • 我已经编辑了答案以引用 WebViewClient 而不是 WebChromeClient
【解决方案3】:

对于遇到此问题的人,当方法 shouldOverrideUrlLoading(WebView view, WebResourceRequest request) 未被调用时,请查找您的 minSdkVersion。如果您使用 API 24 以下,则应使用shouldOverrideUrlLoading(WebView view, String url)

【讨论】:

  • 这个对我有用。但是 Youtube 中的内部视频链接不会触发此方法。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2013-05-16
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多