22

-编辑:找到的解决方案
-经过大量搜索后弄清楚了-一个人(我的意思是一个人)说他们改为使用 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() 中。

4

3 回答 3

57

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

  1. 你加载一个像

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

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

您可能需要考虑在此处重写类似的onProgressChanged方法WebChromeClient如何侦听 WebView 完成加载 URL? onPageFinished()方法WebViewClient

于 2011-07-18T20:31:11.043 回答
15

由于先前的回答和评论为我指明了正确的方向,我发现我认为这是一种合理的方法。

我所做的是在自定义 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 一起,您可以在检测到重定向时放置您想要运行的任何特定代码。

于 2012-02-29T03:46:23.997 回答
3

对于偶然发现这一点的人,当shouldOverrideUrlLoading(WebView view, WebResourceRequest request)没有调用该方法时,请查找您的minSdkVersion. 如果你使用低于 API 24,你应该使用shouldOverrideUrlLoading(WebView view, String url).

于 2019-05-17T05:55:39.223 回答