WebViewClient的onPageStarted
最近在学android,参考了一篇比较好的贴子,
android开发我的新浪微博客户端-OAuth认证过程中用WebView代替原来的系统自带浏览器
这的确是个不错的帖子,
很多人回帖说这短小代码写的有点瑕疵:返回pin码时,显示授权码的界面会显示几秒钟,而且多数时候我们都不需要去给用户显示这个页面。
再就是在我想来,不要让android去处理一些没必要的事件 也是对程序性能有极大提高,就如该贴中的
wv.addJavascriptInterface(new JavaScriptInterface(), "Methods");
然后是 一连串的js嵌入,加载,运行,匹配字符串等等功能的执行...
wv.loadUrl("javascript:window.Methods.getHTML(document.getElementsByTagName('span')[0].innerHTML);");
(这些代码很有用,我也先在这里保留一份,js的强大无处不在)
想来,其实很简单,不要被发帖者的思路捆绑死了,程序开发举一反三是硬道理,
既然WebViewClient类 有onPageFinished() 的函数来执行页面载入完毕后要处理的事情,
那肯定也有函数在页面载入之前执行的...翻了翻,的确发现 onPageStarted() 函数,
就在 onPageStarted() 里面写点代码,就足以解决问题,而且不需要用到JS去获取该页面中的pin码。
在前面获取Request Token地址的步骤中,callback地址随便给个值,sina 就会给你返回带pin码的URL,分析这个URL把pin码截出来就好了
String requestTokenUrl = httpOauthprovider.retrieveRequestToken(httpOauthConsumer, "nic");
然后就是WebViewClient 的 onPageStarted() 函数了:
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// System.out.println("start----url:" + url);
int start = url.indexOf(oauth.signpost.OAuth.OAUTH_VERIFIER);
if(start > -1){
String pinStr = url.substring(start);
System.out.println("start----get it! " + pinStr);
intent.putExtra("oauth_verifier", pinStr);
setResult(RESULT_OK, intent);
finish();
}else{
super.onPageStarted(view, url, favicon);
}
}
获取到所要的 oauth_verifier (即pin码)后,返回上一层Activity即可进行下一步处理。
浙公网安备 33010602011771号