`

8.腾讯微博Android客户端开发——自动获取验证码(2)

 
阅读更多

原文http://blog.csdn.net/coolszy/article/details/6601176

 

上一节给大家讲解通过调用android系统自带的浏览器进行授权认证的,使用该种方式能很容易的完成认证,但是该种方式有个弊端,也就是如果使用第三方的浏览器如UC、天天等,输入完QQ账号信息点击“授权”后并不能再次跳转到MainActivity,导致我们的认证失败。这个问题应该是非常严重的问题,因为大部分用户都会选择第三方的浏览器作为默认的浏览器。本次给大家讲解自动获取验证码的第二种解决方案,克服上一种方法的缺陷。

第二种解决方案的主角就是我们的WevView控件,我们可以使用WebView控件来进行浏览器的操作,而不使用系统或者第三方的浏览器。

1.首先创建一个Activity,命名为WebViewActivity,该Activity种只包含一个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种添加一个Button,用于启动WebViewActivity

 

 

String url = "https://open.t.qq.com/cgi-bin/authorize";
Weibo weibo = new Weibo();
//修改getRequestToken()方法,返回结果为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);
//有些时候获取oauth_token失败,因此再次获取
if (TextUtil.isEmpty(oauthToken))
{
	getVerifier();
	return;
}
//构造请求的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);
//启动WebViewActivity
startActivity(intent);

 

 

3.WebViewActivityonCreate添加如下代码,进行浏览器的初始化:

 

@Override
public 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....");
			}
		}
	}
}

 

 

 

此时如果我们运行模拟器,点击按钮启动WebViewActivity按钮后,运行效果和启动浏览器差不多,我们输入QQ账户信息,点击“授权”,如果callback为空,则Activity会显示授权码。

4.下面我们需要处理的就是如何自动获取授权码。我们知道WebView是支持JavaScript,我们可以通过JavaScript进行授权码的获去,在onCreate()方法中添加如下代码

 

//绑定java对象到JavaScript中,这样就能在JavaScript中调用java对象,实现通信。
//这种方法第一个参数就是java对象,第二个参数表示java对象的别名,在JavaScript中使用
webView.addJavascriptInterface(new JavaScriptInterface(), "Methods");
WebViewClient client = new WebViewClient()
{
	/**
	 * 回调方法,当页面加载完毕后执行
	 */
	@Override
	public void onPageFinished(WebView view, String url)
	{
		Log.i(TAG, "WebView onPageFinished");
		//执行获取授权码的JavaScript
		view.loadUrl("javascript:window.Methods.getHTML('<head>'+document.getElementsByTagName('body')[0].innerHTML+'</head>');");
		super.onPageFinished(view, url);
	}
};
webView.setWebViewClient(client);

 

其中JavaScriptInterface类是进行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 = "授权码:[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()方法是通过正则表达式进行授权码的查找,该正则表达式是根据腾讯微博开放平台返回验证码的html源文件进行设置:

<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 = '你拒绝了授权此应用访问你的腾讯微博帐户,将不能使用此应用功能。';
         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" onclick="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>
			授权使用腾讯微博帐号
		</h1>
		<cite>授权后 <span>Android开发</span> 将可访问并使用你的微博帐号</cite>
	</div>
	<div id="conter">
		<ul>
			<li>
				授权码:240547
			</li>
		</ul>
	</div>
	<div id="info">
		<p>
			腾讯官方授权页面不允许第三方内嵌或伪造
		</p>
		<p>
			授权页面地址为http://open.t.qq.com开头。
		</p>
		<p>
			授权后,在第三方网站的活动应继续遵守《
			<a
				href="http://ti.3g.qq.com/g/s?sid=AUV9TkhR9XziFokSOXQRypk1&r=252180&aid=pno"
				target="_blank">腾讯QQ用户服务条款</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控件获取验证码的方法,解决了上一节的缺陷。


 

课程下载地址:http://u.115.com/file/e60px8bk

文档下载地址:http://download.csdn.net/source/3437652

源码下载地址:http://u.115.com/file/aq2vc2re

 

 

分享到:
评论

相关推荐

    3.腾讯微博Android客户端开发——签名、辅助、辅助方法编写

    本文详细介绍了在腾讯微博Android客户端开发中如何实现OAuth 1.0a认证机制中的关键部分——请求签名的生成。通过对URL编码方法的特殊处理和HMAC-SHA1算法的具体实现,我们不仅能够确保请求的合法性和安全性,还能更...

    腾讯微博Android客户端开发.rar

    《腾讯微博Android客户端开发详解》 在移动应用领域,Android平台因其开源、灵活的特性,吸引了众多开发者投身其中。本文将深入探讨“腾讯微博Android客户端开发”,解析其背后的技术架构和实现原理,帮助读者理解...

    [腾讯微博Android客户端开发]课程文档及源代码

    【腾讯微博Android客户端开发】是一门深入探讨如何构建Android平台上腾讯微博应用的课程,涵盖了从基础知识到高级技术的完整开发流程。这门课程旨在帮助开发者理解Android应用开发的基本原理,特别是针对社交媒体...

    腾讯微博Android客户端开发

    【腾讯微博Android客户端开发】是关于构建在Android平台上与腾讯微博接口交互的应用程序的过程。在这一过程中,重点涉及OAuth认证,这是一种确保用户信息安全并允许第三方应用访问受保护资源的授权协议。 OAuth认证...

    腾讯微博Android客户端开发(完整版)

    【腾讯微博Android客户端开发】涉及的关键知识点主要集中在OAuth认证机制上,这是开发腾讯微博Android客户端时必须掌握的重要概念。OAuth是一种授权协议,旨在允许第三方应用在用户授权的情况下,安全地访问用户在...

    腾讯微博Android客户端开发OAuth认证学习[收集].pdf

    腾讯微博Android客户端开发使用OAuth 1.0A版本进行用户授权,以确保用户在使用非官方客户端时,不会直接暴露QQ号和密码,降低安全风险。 OAuth的核心思想是通过令牌(Token)机制来实现授权,而不是直接使用用户名...

    腾讯微博android 客户端 Oauth 认证流程序示例

    本示例主要探讨的是腾讯微博Android客户端OAuth认证流程,这对于任何想要集成腾讯微博服务到Android应用的开发者来说至关重要。 OAuth(开放授权)是一种授权机制,允许第三方应用在用户许可的情况下,安全地访问...

    开发腾讯微博Android应用:获取Access Token流程

    腾讯微博Android客户端开发——换取Access,课程下载地址:http://blog.csdn.net/coolszy。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    毕业论文安卓827腾讯微博客户端app.doc

    本文档是关于Android 腾讯微博客户端的设计与实现的毕业论文,论文主要介绍了 Android 腾讯微博客户端的开发过程,包括需求分析、系统设计、代码实现和功能测试等方面的内容。 在背景意义部分,论文首先介绍了腾讯...

    Android源码——腾讯微博客户端源码.7z

    本文将围绕“Android源码——腾讯微博客户端源码.7z”这一主题,详细探讨其中的关键知识点,旨在帮助读者掌握Android开发中的核心技术和最佳实践。 首先,我们要了解Android应用的基本架构。一个标准的Android应用...

    Android.腾讯微博

    【Android腾讯微博】是一款基于Android平台的客户端应用,它允许用户在移动设备上方便地浏览、发布和互动微博。此毕业设计项目展示了如何利用Android SDK和腾讯微博的开放API来开发一个功能完整的社交应用程序。 ...

Global site tag (gtag.js) - Google Analytics