腾讯微博Android客户端开发——自动获取验证码
上一節(jié)給大家講解通過調(diào)用android系統(tǒng)自帶的瀏覽器進(jìn)行授權(quán)認(rèn)證的,使用該種方式能很容易的完成認(rèn)證,但是該種方式有個(gè)弊端,也就是如果使用第三方的瀏覽器如UC、天天等,輸入完QQ賬號(hào)信息點(diǎn)擊“授權(quán)”后并不能再次跳轉(zhuǎn)到MainActivity,導(dǎo)致我們的認(rèn)證失敗。這個(gè)問題應(yīng)該是非常嚴(yán)重的問題,因?yàn)榇蟛糠钟脩舳紩?huì)選擇第三方的瀏覽器作為默認(rèn)的瀏覽器。本次給大家講解自動(dòng)獲取驗(yàn)證碼的第二種解決方案,克服上一種方法的缺陷。
第二種解決方案的主角就是我們的WevView控件,我們可以使用WebView控件來進(jìn)行瀏覽器的操作,而不使用系統(tǒng)或者第三方的瀏覽器。
1.首先創(chuàng)建一個(gè)Activity,命名為WebViewActivity,該Activity種只包含一個(gè)WevView控件:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<WebView
android:id="@+id/web"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
/>
</ScrollView>
2.在MainActivity種添加一個(gè)Button,用于啟動(dòng)WebViewActivity:
String url = "https://open.t.qq.com/cgi-bin/authorize";Weibo weibo = new Weibo();
//修改getRequestToken()方法,返回結(jié)果為HashMap
Map<String, String> map = weibo.getRequestToken();
//獲取oauth_token
oauthToken = map.get("oauth_token");
oauthTokenSecret = map.get("oauth_token_secret");
Log.i(TAG, "Request Token="+oauthToken);
Log.i(TAG, "Request Token Secret="+oauthTokenSecret);
//有些時(shí)候獲取oauth_token失敗,因此再次獲取
if (TextUtil.isEmpty(oauthToken))
{
getVerifier();
return;
}
//構(gòu)造請(qǐng)求的URL
StringBuilder urlBuilder = new StringBuilder();
urlBuilder.append(url);
urlBuilder.append("?");
urlBuilder.append("oauth_token="+oauthToken);
Intent intent = new Intent(MainActivity.this,WebViewActivity.class);
Bundle bundle=new Bundle();
bundle.putString("url", urlBuilder.toString());
intent.putExtras(bundle);
//啟動(dòng)WebViewActivity
startActivity(intent);
3.給WebViewActivity的onCreate添加如下代碼,進(jìn)行瀏覽器的初始化:
@Overridepublic void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.webview);
WebView webView = (WebView) findViewById(R.id.web);
Intent intent = this.getIntent();
if (!intent.equals(null))
{
Bundle bundle = intent.getExtras();
if (bundle != null)
{
if (bundle.containsKey("url"))
{
String url = bundle.getString("url");
WebSettings webSettings = webView.getSettings();
// 支持JavScript
webSettings.setJavaScriptEnabled(true);
webSettings.setSupportZoom(true);
webView.requestFocus();
webView.loadUrl(url);
Log.i(TAG, "WebView Starting....");
}
}
}
}
此時(shí)如果我們運(yùn)行模擬器,點(diǎn)擊按鈕啟動(dòng)WebViewActivity按鈕后,運(yùn)行效果和啟動(dòng)瀏覽器差不多,我們輸入QQ賬戶信息,點(diǎn)擊“授權(quán)”,如果callback為空,則Activity會(huì)顯示授權(quán)碼。
4.下面我們需要處理的就是如何自動(dòng)獲取授權(quán)碼。我們知道WebView是支持JavaScript,我們可以通過JavaScript進(jìn)行授權(quán)碼的獲去,在onCreate()方法中添加如下代碼
//綁定java對(duì)象到JavaScript中,這樣就能在JavaScript中調(diào)用java對(duì)象,實(shí)現(xiàn)通信。//這種方法第一個(gè)參數(shù)就是java對(duì)象,第二個(gè)參數(shù)表示java對(duì)象的別名,在JavaScript中使用
webView.addJavascriptInterface(new JavaScriptInterface(), "Methods");
WebViewClient client = new WebViewClient()
{
/**
* 回調(diào)方法,當(dāng)頁面加載完畢后執(zhí)行
*/
@Override
public void onPageFinished(WebView view, String url)
{
Log.i(TAG, "WebView onPageFinished");
//執(zhí)行獲取授權(quán)碼的JavaScript
view.loadUrl("javascript:window.Methods.getHTML('<head>'+document.getElementsByTagName('body')[0].innerHTML+'</head>');");
super.onPageFinished(view, url);
}
};
webView.setWebViewClient(client);
其中JavaScriptInterface類是進(jìn)行js處理的類:
class JavaScriptInterface
{
private static final String TAG = "MainActivity";
public void getHTML(String html)
{
Log.i(TAG, html);
String verifier = getVerifier(html);
if (!TextUtil.isEmpty(verifier))
{
Log.i(TAG, "verifier:"+verifier);
}
}
public String getVerifier(String html)
{
String ret = "";
String regEx = "授權(quán)碼:[0-9]{6}";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(html);
boolean result = m.find();
if (result)
{
ret = m.group(0).substring(4);
}
return ret;
}
}
getVerifier()方法是通過正則表達(dá)式進(jìn)行授權(quán)碼的查找,該正則表達(dá)式是根據(jù)騰訊微博開放平臺(tái)返回驗(yàn)證碼的html源文件進(jìn)行設(shè)置:
<head><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport"
content="minimum-scale=1.0, maximum-scale=1.0, initial-scale=1.0, width=device-width, user-scalable=no">
<title></title>
<link href="/style/oauth/mobel.css" rel="stylesheet" type="text/css">
<style>
* {
TEXT-DECORATION: none;
}
</style>
<script type="text/javascript">
var step = 0;
var sub = 0;
function callback(){
}
function cl(){
sub = 0;
document.getElementById('errCode').innerHTML = '你拒絕了授權(quán)此應(yīng)用訪問你的騰訊微博帳戶,將不能使用此應(yīng)用功能。';
document.getElementById('errCode').style.display = 'block';
var c = document.getElementById('conter');
var ql = document.getElementById('loginform');
c.removeChild(ql);
}
function changeimg(){
var i = document.getElementById('imgVerify');
i.src = ".jpg?d="+step;
step++;
/*
i.innerHTML = '';
window.setTimeout(function(){i.innerHTML = '<img id="imgVerify" width="130" height="53" src=".jpg" οnclick="changeimg();" />';},200);
*/
}
function subForm(){
var u = document.getElementById('u');
var p = document.getElementById('p');
if(u.value != '' && p.value!=''){
document.getElementById('login_btn').disabled= true;
}else{
return false;
}
}
function subForm1(){
var u = document.getElementById('u');
var p = document.getElementById('p');
var v = document.getElementById('v');
if(u.value != '' && p.value!='' && v.value != ''){
document.getElementById('login_btn').disabled= true;
}else{
return false;
}
}
</script>
</head>
<body id="body">
<div id="header">
<a href="http://open.t.qq.com"></a>
<p></p>
</div>
<div id="headerTxt">
<h1>
授權(quán)使用騰訊微博帳號(hào)
</h1>
<cite>授權(quán)后 <span>Android開發(fā)</span> 將可訪問并使用你的微博帳號(hào)</cite>
</div>
<div id="conter">
<ul>
<li>
授權(quán)碼:240547
</li>
</ul>
</div>
<div id="info">
<p>
騰訊官方授權(quán)頁面不允許第三方內(nèi)嵌或偽造
</p>
<p>
授權(quán)頁面地址為http://open.t.qq.com開頭。
</p>
<p>
授權(quán)后,在第三方網(wǎng)站的活動(dòng)應(yīng)繼續(xù)遵守《
<a
href="http://ti.3g.qq.com/g/s?sid=AUV9TkhR9XziFokSOXQRypk1&r=252180&aid=pno"
target="_blank">騰訊QQ用戶服務(wù)條款</a>》。
</p>
</div>
<div id="footer">
? 2011 Tencent Inc.
</div>
<script type="text/javascript">
var g_btrace_zhibo = new Image(1,1);
var _u = 'http://btrace.qq.com/collect?ftime=1310183089&sIp=-1266685874&iQQ=0&sBiz=moauth&sOp=inter&iSta=0&iTy=424&iFlow=0&t=3&c=0&oa=1200b4a5a24f45509478a4a809d75495&r=7';
g_btrace_zhibo.src = _u;
</script>
</body>
</head>
至此我們就完成了如何通過WebView控件獲取驗(yàn)證碼的方法,解決了上一節(jié)的缺陷。
?
課程下載地址:http://u.115.com/file/e60px8bk
文檔下載地址:http://download.csdn.net/source/3437652
源碼下載地址:http://u.115.com/file/aq2vc2re
轉(zhuǎn)載于:https://www.cnblogs.com/jdsjlzx/archive/2011/07/19/2110911.html
總結(jié)
以上是生活随笔為你收集整理的腾讯微博Android客户端开发——自动获取验证码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: geotrellis使用(二十九)迁移g
- 下一篇: 【Android源代码下载】收集整理an