Android新浪微博客户端(三)——添加多个账户及认证
原文出自:方杰|http://fangjie.info/?p=72 转载请注明出处
一.微博OAuth2.0认证
首先来说说授权过程,我这里授权是通过SDK的,先添加SDK的jar包,微博SDK的demo中有,如下:

因为在上一篇文章中说到的主框架模式,那种处理方式是在MainService的第二线程中。所以一上来我是把授权过程当作一个任务发到MainService来处理,但是做了半天很郁闷。错误。这样不行,因为微博授权过程里面涉及到对话框,也就是说在非UI线程中改变UI,这当然是不允许的。所以我就没有把这个任务放到主框架模式中。
还有个可以说的是微博API的特点,微博的API都是采用一种异步回调处理方式,如下:
//先请求授权:
mWeibo.authorize(context, new AuthDialogListener());
//授权回调
class AuthDialogListener implements WeiboAuthListener {
@Override
public void onComplete(Bundle values) {
}
@Override
public void onError(WeiboDialogError e) {
}
@Override
public void onCancel() {
}
@Override
public void onWeiboException(WeiboException e) {
}
}
在调用微博API时通常是传一个监听器过去,异步处理完成后会调用监听器的实现方法。也就是说你在做完:
mWeibo.authorize(context, new AuthDialogListener());
然后立马获取access_token,必然是null,因为它可能还没有回调成功。所以针对这个特点,我说下我的实现方式,自我感觉自己的实现方式都不是很好,自己没有学过设计模式,欢迎大家给我指证。
AuthUtil.java
package com.fangjie.weibo.util;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import com.fangjie.weibo.ui.AuthActivity;
import com.weibo.sdk.android.Oauth2AccessToken;
import com.weibo.sdk.android.Weibo;
import com.weibo.sdk.android.WeiboAuthListener;
import com.weibo.sdk.android.WeiboDialogError;
import com.weibo.sdk.android.WeiboException;
public class AuthUtil
{
private Weibo mWeibo;
private static final String CONSUMER_KEY = "798515055";// 替换为开发者的appkey,例如"1646212860";
private static final String REDIRECT_URL = "http://fangjie.duapp.com";
public static Oauth2AccessToken accessToken;
private Context context;
public AuthUtil(Context context)
{
this.context=context;
}
//获取授权
public void reqAccessToken()
{
accessToken=null;
mWeibo = Weibo.getInstance(CONSUMER_KEY, REDIRECT_URL);
mWeibo.authorize(context, new AuthDialogListener());
}
//获取accessToken
public Oauth2AccessToken getAccessToken()
{
Oauth2AccessToken token=accessToken;
accessToken=null;
return token;
}
//授权回调
class AuthDialogListener implements WeiboAuthListener {
@Override
public void onComplete(Bundle values) {
String token = values.getString("access_token");
String expires_in = values.getString("expires_in");
AuthUtil.accessToken = new Oauth2AccessToken(token, expires_in);
//去除Cookie,防止拿原来授权的帐号自动授权
CookieSyncManager.createInstance(context);
CookieSyncManager.getInstance().startSync();
CookieManager.getInstance().removeAllCookie();
if (AuthUtil.accessToken.isSessionValid()) {
//认证成功!!
Log.i("OUTPUT","accesstaken from oncomplete"+ AuthUtil.accessToken.getToken());
Intent intent=new Intent(context,AuthActivity.class);
context.startActivity(intent);
}
}
@Override
public void onError(WeiboDialogError e) {
}
@Override
public void onCancel() {
}
@Override
public void onWeiboException(WeiboException e) {
}
}
}
解释:
就是在授权的时候,先发送授权申请,reqAccessToken(),授权成功后跳到AuthActivity授权页面,然后在去getAccessToken(),这时候的access_token值就不是空了。而跳到授权页面还有一种可能,就是从登录界面跳转过来的,所以在AuthActivity初始化后,就会判断getAccessToken()为不为null,如果是null,就是登录界面过来的,否则就是从授权成功跳转的。这里为了避免使得添加多个授权帐号时,getAccessToken()获取的是上次的授权成功保存的access_token,所以每次获取完之后就给它赋null。
//获取accessToken
public Oauth2AccessToken getAccessToken()
{
Oauth2AccessToken token=accessToken;
accessToken=null;
return token;
}
AuthActivity.java
package com.fangjie.weibo.ui;
import java.util.HashMap;
import java.util.Map;
import com.weibo.sdk.android.Oauth2AccessToken;
import com.fangjie.weibo.R;
import com.fangjie.weibo.bean.Task;
import com.fangjie.weibo.logic.MainService;
import com.fangjie.weibo.util.AuthUtil;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class AuthActivity extends Activity implements IWeiboAcitivity{
private Button btn_auth;
private Dialog dialog;
private Oauth2AccessToken access_token;
private AuthUtil util;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.auth);
util=new AuthUtil(AuthActivity.this);
access_token=util.getAccessToken();
/**
* 采用access_token判断是开始授权还是授权成功回调
* 1.开始授权就显示授权提醒的对话框
* 2.授权回调就做获取用户信息然后保存数据库的操作
*
* 缺陷:这地方设计的不是
*/
//授权完成后重新跳转到该Activity
if(access_token!=null){
//获取授权码
Log.i("OUTPUT","OAuth授权完成,已经获取到token:"+access_token.getToken());
progressDialog=new ProgressDialog(this);
progressDialog.setMessage("正在获取用户信息,请稍候...");
progressDialog.show();
/**
* 新开任务:GET_USERINFO_BY_TOKEN
* 通过授权获得的token获取UserInfo,并保存到数据库中
*/
Map<String,Object> params=new HashMap<String,Object>();
params.put("token", access_token);
Task task=new Task(Task.GET_USERINFO_BY_TOKEN,params);
MainService.newTask(task);
MainService.addActivty(AuthActivity.this);
}
//授权开始时加载该Activity
else
{
View diaView=View.inflate(this, R.layout.dialog, null);
dialog=new Dialog(AuthActivity.this,R.style.dialog);
dialog.setContentView(diaView);
dialog.show();
btn_auth=(Button)diaView.findViewById(R.id.btn_auth);
btn_auth.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//请求授权
util.reqAccessToken();
}
});
}
}
@Override
public void init() {
// TODO Auto-generated method stub
}
@Override
public void refresh(int taskID,Object... objects) {
// TODO Auto-generated method stub
if(((String)objects[0]).equals("成功"))
{
progressDialog.dismiss();
MainService.reMoveActivty(AuthActivity.this);
Intent intent=new Intent(AuthActivity.this,LoginActivity.class);
startActivity(intent);
finish();
}
}
}
Android新浪微博客户端(三)——添加多个账户及认证的更多相关文章
- android 新浪微博客户端的表情功能的实现
这是一篇好文章,我转来收藏,技术的最高境界是分享. 最近在搞android 新浪微博客户端,有一些心得分享弄android客户端表情功能可以用以下思路1.首页把新浪的表情下载到本地一文件夹种,表情图片 ...
- Android新浪微博客户端(四)——添加多个账户及认证
原文出自:方杰| http://fangjie.info/?p=75转载请注明出处 二.获取用户信息并保存数据库 上面说到加载AuthActivity有两种情况,其中一种就是授权成功回调,在授权回调成 ...
- Android新浪微博客户端(二)——添加多个账户及认证
原文出自:方杰| http://fangjie.info/?p=69 转载请注明出处 先看下实现效果: 欢迎界面: 第一次进入登录界面登录由于在登录界面没有已授权用户信息,所以自动跳转到授权界面. ...
- Android新浪微博客户端(七)——ListView中的图片异步加载、缓存
原文出自:方杰|http://fangjie.info/?p=193转载请注明出处 最终效果演示:http://fangjie.sinaapp.com/?page_id=54 该项目代码已经放到git ...
- Android新浪微博客户端(六)——Home界面的ListView
原文出自:方杰|http://fangjie.info/?p=184转载请注明出处 最终效果演示:http://fangjie.info/?page_id=54该项目代码已经放到github:http ...
- 新浪微博客户端(8)-添加按钮到TabBar
在tabBar的中部添加一个发送微博的按钮. DJTabBar.h #import <UIKit/UIKit.h> @class DJTabBar; @protocol DJTabBarD ...
- Android新浪微博客户端(五)——主界面的TabHost和WeiboUtil
原文出自:方杰|http://fangjie.info/?p=183转载请注明出处 最终效果演示:http://fangjie.info/?page_id=54 该项目代码已经放到github:htt ...
- Android新浪微博客户端(一)——主框架搭建
原文出自:方杰| http://fangjie.info/?p=62 转载请注明出处 提前声明的是,我是按照Ivan的这套教程学下来的. 首先,对于任何应用我们都需要建立一套消息处理机制,就是当用户在 ...
- android开发新浪微博客户端 完整攻略 [新手必读]
开始接触学习android已经有3个礼拜了,一直都是对着android的sdk文档写Tutorials从Hello World到Notepad Tutorial算是初步入门了吧,刚好最近对微博感兴趣就 ...
随机推荐
- codevs 2612 最有分解方案 (贪心)
/* 数字不重复 将一个正整数分解成若干的整数的和 数字不重复 且数字不相同 保证不重复的话 贪心策略是从2开始分 然后把最后剩下的数均匀分到后面 证明嘛 这里写的可能不是很严谨 对于一个n 如果我们 ...
- 5阻止A默认行为和JS实现页面跳转的方法
<!--HTML中阻止A标签的默认行为: href="javascript:;" href="javascript:void 0;"--><! ...
- html.day01
1.web标准: 1. 结构 (xhtml) 2. 表现(css) 3.行为(js) html 超文本标记语言 xhtml (严格型超文本标记语言) 2.规范: 1. 所有标签(标记)都要 ...
- 命令行命令mvn
在cmd命令行敲击mvn clean install 默认读取的maven配置文件是D:\software\apache-maven-3.2.1\conf\settings.xml 这个文件里面配置有 ...
- Iframe之间及iframe与父窗体之间值的传递
方法一:ScriptManager.RegisterClientScriptBlock(this,typeof(Page), "NoInformation", "wind ...
- jsp中文乱码终极解决方法(转)
一, 找出问题的根源乱码可能出现的地方: jsp页面中 jsp页面之间相互传参的参数 与数据库中数据的存取 基本归纳为以上几种. 二, 寻找解决方案 出现在jsp页面中,是由于没有设置jsp页面的中文 ...
- xcode升级插件失效修复
每次xcode升级以后,插件都会失效.可以通过一行命令解决这个问题. 摘自传人的博客 find ~/Library/Application\ Support/Developer/Shared/Xcod ...
- ExtJs API 下载以及部署
ExtJs API 下载方法 1.进入sencha官网:https://www.sencha.com/ 2.点击“Docs”进入文档帮助页面:http://docs.sencha.com/ 3.点击左 ...
- 【COGS1672】难存的情缘
[题目描述] 一天机房的夜晚,无数人在MC里奋斗着... 大家都知道矿产对于MC来说是多么的重要,但由于矿越挖越少,勇士们不得不跑到更远的地方挖矿,但这样路途上就会花费相当大的时间,导致挖矿效率底下. ...
- CountDownLatch 和 CyclicBarrier 的运用及实现原理
I.CountDownLatch 和 CyclicBarrier 的运用 CountDownlatch: 定义: 其是一个线程同步的辅助工具,通过它可以做到使一条线程一直阻塞等待,直到其他线程完成其所 ...