上一节给大家讲解通过调用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.给WebViewActivity的onCreate添加如下代码,进行浏览器的初始化:

@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" ο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>
授权使用腾讯微博帐号
</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

转载于:https://www.cnblogs.com/coolszy/archive/2011/07/12/2104688.html

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

  1. 腾讯微博Android客户端开发——自动获取验证码

    上一节给大家讲解通过调用android系统自带的浏览器进行授权认证的,使用该种方式能很容易的完成认证,但是该种方式有个弊端,也就是如果使用第三方的浏览器如UC.天天等,输入完QQ账号信息点击" ...

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

    通过前面的介绍,我们成功获取了Access Token,但是在该过程中有个不好的地方:用户输入完QQ信息后,需要记录验证码,然后返回至Activity手动输入验证码,这将会使我们的程序显得非常不友好. ...

  3. android 腾讯微博授权,5腾讯微博Android客户端开发获取请求用户授权Request Token.pdf...

    腾讯微博Android客户端开发 博客:/coolszy Android Android 腾讯微博AAnnddrrooiidd客户端开发 RequestToken RequestToken --获取请 ...

  4. 腾讯微博Android客户端开发——OAuth认证介绍

    腾讯微博是一个由腾讯推出,提供微型博客服务的类Twitter网站.在腾讯官方 的软件或网站中发布微博我们需要输入QQ号和密码,同样如果我们自己开发客户端给用户使用,我们也需要用户提供QQ号和密码,这就 ...

  5. 腾讯微博Android客户端开发 - OAuth1.0认证介绍

    2019独角兽企业重金招聘Python工程师标准>>> http://wiki.open.t.qq.com/index.php/OAuth%E6%8E%88%E6%9D%83%E8% ...

  6. 腾讯微博android版本,腾讯微博 Android版

    腾讯微博这是专为Android用户打造的腾讯微博手机客户端,让您随时随地与亿万微博用户分享生活和资讯.腾讯微博Android客户端,专为Android用户打造,让您随时随地与亿万微博用户分享生活和资讯 ...

  7. 行代码入门python_新浪微博Android客户端开发视频教程(36讲)

    教程名称:新浪微博Android客户端开发视频教程(36讲) 课程目录: [IT教程网]新浪微博Android客户端介绍 [IT教程网]新浪微博Android客户端相关资料 [IT教程网]新浪微博An ...

  8. 腾讯微博android版本,腾讯微博下载2017手机版下载-腾讯微博 安卓版v6.1.2-PC6安卓网...

    微博这东西小编就这么喜欢而已.不管是sina还是qq,丢不掉,逃不了.腾讯家的还不错.关联的朋友很多,总能在这里面找到熟悉的东西,QQ牵连的很强大 功能介绍 专为Android用户打造的腾讯微博手机客 ...

  9. 腾讯微博android版本,腾讯微博下载2021-腾讯微博app最新版本下载-腾讯微博下载安装...

    使用相关 腾讯微博怎么批量删除微博   批量删除方法 随着腾讯用户的增多,腾讯微博使用者的数量也逐渐增多,越来越多的人开始在微博中实时发布并记录自己的动态,或者进入微博关注自己感兴趣的发布者,由于腾讯 ...

最新文章

  1. libevent库的安装与使用
  2. kubectl命令自动补全功能
  3. 关系型数据库全表扫描分片详解
  4. 【JavaScript吉光片羽】--- 滑动条
  5. graphql java demo_GraphQL学习,Java简单实现
  6. DBA:介里有你没有用过的“CHUAN”新社区版本Redis6.0
  7. sys模块,subprocess模块
  8. Django 前后端数据传输、ajax、分页器
  9. Springboot使用FastJson后,接口返回中文乱码的问题解决。
  10. python自动化办公入门-[Python] 自动化办公 docx操作Word基础代码
  11. Fizz Buzz 面试题
  12. 软件测试用例关键要素,软件测试用例的设计
  13. 数据库系统概论-绪论
  14. python数据可视化第三章图表辅助元素的定制
  15. 使用phpword替换模板内容 在模板追加内容
  16. 4D 语义分割——TemporalLidarSeg
  17. adf被打开_ADF格式文件 如何打开ADF文件 ADF是什么格式的文件 用什么打开 - The X Online Tools...
  18. 【Python编程】三步完成如何从视频中提取音频?
  19. python对淘宝运营有帮助吗_淘宝运营,有前途吗?
  20. docker安装mysql8 并且忽略大小写问题解决

热门文章

  1. javascript写计数器
  2. iOS初级开发笔记:Block回调,实现简单的绑定支付宝逻辑
  3. 9个tcpdump使用实例
  4. 云安全趋势下脚踏实地力拼网络危胁
  5. NFS网络文件共享存储服务器
  6. 由几个问题引出EJB的概念
  7. java基础 关于转换流
  8. oracle启动服务和监听命令
  9. 如何利用CSS给同一个网页中的超链接设置设置不同的样式?
  10. 浏览器根据什么来判定脚本失控?