Android 的 WebView 中的 shouldOverrideUrlLoading 未运行

Posted

技术标签:

【中文标题】Android 的 WebView 中的 shouldOverrideUrlLoading 未运行【英文标题】:shouldOverrideUrlLoading in WebView for Android not running 【发布时间】: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 时都会运行。 我在模拟器上遇到了同样的问题,但在真实设备上却没有。很奇怪。 【参考方案1】:

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

    你加载一个像

    这样的 URL
    loadUrl("http://www.google.com");
    

    浏览器通过 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 中的内部视频链接不会触发此方法。有什么想法吗?

以上是关于Android 的 WebView 中的 shouldOverrideUrlLoading 未运行的主要内容,如果未能解决你的问题,请参考以下文章

Android - webview 中的本地图像

Android安全开发之WebView中的地雷

Android 下的 WebView 中数据如何保存

Android API 21 中的 Webview 为空白/白色

多进程中的 Android Pie (9.0) WebView

如何从 webview 中的按钮启动相机 -Android