-Edit:找到解决方案 -
经过一番搜索后想出来 - 一个人(我的意思是一个人)说他们改为使用onPageLoad();这完全符合我的目的。区别在于onPageLoad()的运行时间晚于shouldOverrideUrlLoading,但它对我的代码没有影响。
我正在尝试使用OAuth为Android应用设置Twitter授权,到目前为止我可以成功将用户发送到授权网址,但是,我现在要做的是拦截重定向到回调(这只会导致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());
事情是甚至是System.out.println(“url”); (我正在调试)没有运行!所以我很漂亮想法很干,找不到有类似问题的人。授权URL运行良好,我可以成功授权应用程序,但由于某种原因重定向到回调URL永远不会被截获。任何帮助将不胜感激,这是在我的onResume(),如果这很重要。
答案 0 :(得分:50)
经过一些研究后我得出结论,尽管大多数教程都说,shouldOverrideUrlLoading()
在以下情况下不会被调用:
您加载了一个类似
的网址loadUrl("http://www.google.com");
浏览器通过HTTP重定向自动重定向用户。 (请参阅以下@hmac关于重定向的评论)
然而会在您点击网页内的网页内的链接时被调用。 IIRC Twitter授权使用HTTP重定向。但是,如果所有教程都说它有用,这将是有用的。我认为这是来自Android API的一个非常古老的版本...
您可能需要考虑覆盖onProgressChanged
的{{1}}方法,例如:How to listen for a WebView finishing loading a URL? 或 WebChromeClient
onPageFinished()
方法1}}。
答案 1 :(得分:13)
我已经找到了我认为合理的方式来做到这一点,这要归功于之前的回答和评论,指出了我正确的方向。
我所做的是在自定义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之外,您还会在检测到重定向时放置您想要运行的任何特定代码。
答案 2 :(得分:0)
对于绊脚石的人们,当未调用方法shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
时,请查找您的minSdkVersion
。如果您使用API 24以下的版本,则应使用shouldOverrideUrlLoading(WebView view, String url)
。