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()
在以下情况下不会被调用:
你加载一个像
这样的 URLloadUrl("http://www.google.com");
浏览器通过 HTTP 重定向自动重定向用户。 (请参阅下面@hmac 关于重定向的评论)
它确实,当您单击 web 视图内的网页内的链接时会被调用。 IIRC twitter 授权使用 HTTP 重定向.. 太糟糕了,如果它像所有教程所说的那样工作,这将很有帮助。我认为这是来自一个非常旧版本的 Android API...
您可能需要考虑覆盖WebChromeClient
的onProgressChanged
方法,如下所示:How to listen for a WebView finishing loading a URL? 或 WebViewClient
的onPageFinished()
方法。
【讨论】:
啊,谢谢。如果有的话,我会使用前者,因为回调只会显示 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 API 21 中的 Webview 为空白/白色