forOverrideUrlLoading在WebView for Android中未运行

Jus*_*tin 21 https android android-webview webviewclient

-Edit:找到解决方案
- 在经过一番繁重的搜索后想出来 - 一个人(我的意思是一个人)说他们改为使用onPageLoad(); 这完全符合我的目的.区别在于onPageLoad()的运行时间晚于shouldOverrideUrlLoading,但它对我的代码没有影响.

我正在尝试使用OAuth为Android应用程序设置Twitter授权,到目前为止我可以成功将用户发送到授权URL,但是,我现在要做的是拦截重定向到回调(这只是导致404错误,我们的回调URL不会在我们的服务器上有关联的页面).我要做的是检查URL是否是我们的回调,然后从URL中提取OAuth Verifier.我使用以下代码设置我的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());
Run Code Online (Sandbox Code Playgroud)

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

cit*_*onn 52

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

  1. 你加载一个像这样的URL

    loadUrl("http://www.google.com");
    
    Run Code Online (Sandbox Code Playgroud)
  2. 浏览器通过HTTP重定向自动重定向用户.(请参阅以下有关重定向的@hmac的评论)

但是,当您单击webview内的网页内的链接时,它会被调用.IIRC Twitter授权使用HTTP重定向.但是,如果所有教程都说它有用,这将是有用的.我认为这是来自Android API的一个非常古老的版本...

您可能需要考虑覆盖类似的onProgressChanged方法WebChromeClient:如何监听WebView完成加载URL? 所述onPageFinished()的方法WebViewClient.

  • OnPageFinished对我来说不起作用,但onProgressChanged可以.我通过打印带有onPageFinished进度的日志消息测试了这一点,并注意到调用onPageFinished时进度并不总是100.根据有关onPageFinished的android文档,"此方法仅针对主框架调用",因此我认为使用此方法确定页面是否真正完全加载是不可靠的. (2认同)
  • 重新 2. 这在 API 24 方法中发生了变化:`shouldOverrideUrlLoading(WebView view, WebResourceRequest request)` 也被调用以进行重定向,但使用 `request.isRedirect()` 你可以根据需要进行控制 (2认同)

Mak*_*aks 14

我发现我认为这是一种合理的方式来做到这一点,这要归功于之前的回答和评论,指出了我正确的方向.

我所做的是在自定义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;
  }
}
Run Code Online (Sandbox Code Playgroud)

当然,与Log.d一起,您将在检测到重定向时放置您想要运行的任何特定代码.

  • 这些是自定义*WebViewClient*的功能,而不是*WebChromeClient*的功能,以防万一有人偶然发现这个 (3认同)