Android新浪微博客户端(三)——添加多个账户及认证
来源:互联网 发布:手机版收银软件 编辑:程序博客网 时间:2024/06/05 23:54
原文出自:方杰| http://fangjie.sinaapp.com/?p=72 转载请注明出处
最终效果演示:http://fangjie.sinaapp.com/?page_id=54
该项目代码已经放到github:https://github.com/JayFang1993/SinaWeibo
一.微博OAuth2.0认证
首先来说说授权过程,我这里授权是通过SDK的,先添加SDK的jar包,微博SDK的demo中有,如下:
因为在上一篇文章中说到的主框架模式,那种处理方式是在MainService的第二线程中。所以一上来我是把授权过程当作一个任务发到MainService来处理,但是做了半天很郁闷。错误。这样不行,因为微博授权过程里面涉及到对话框,也就是说在非UI线程中改变UI,这当然是不允许的。所以我就没有把这个任务放到主框架模式中。
还有个可以说的是微博API的特点,微博的API都是采用一种异步回调处理方式,如下:
//先请求授权:mWeibo.authorize(context, new AuthDialogListener());//授权回调class AuthDialogListener implements WeiboAuthListener {@Overridepublic void onComplete(Bundle values) {}@Overridepublic void onError(WeiboDialogError e) {}@Overridepublic void onCancel() {}@Overridepublic 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());}//获取accessTokenpublic Oauth2AccessToken getAccessToken(){Oauth2AccessToken token=accessToken;accessToken=null;return token;}//授权回调class AuthDialogListener implements WeiboAuthListener {@Overridepublic 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);}}@Overridepublic void onError(WeiboDialogError e) {}@Overridepublic void onCancel() {}@Overridepublic void onWeiboException(WeiboException e) {}}}
解释:
就是在授权的时候,先发送授权申请,reqAccessToken(),授权成功后跳到AuthActivity授权页面,然后在去getAccessToken(),这时候的access_token值就不是空了。而跳到授权页面还有一种可能,就是从登录界面跳转过来的,所以在AuthActivity初始化后,就会判断getAccessToken()为不为null,如果是null,就是登录界面过来的,否则就是从授权成功跳转的。这里为了避免使得添加多个授权帐号时,getAccessToken()获取的是上次的授权成功保存的access_token,所以每次获取完之后就给它赋null。
//获取accessTokenpublic 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(); } }}
欢迎各位关注我的个人站点:http://fangjie.sinaapp.com/
- Android新浪微博客户端(三)——添加多个账户及认证
- Android新浪微博客户端(三)——添加多个账户及认证
- Android新浪微博客户端(二)——添加多个账户及认证
- Android新浪微博客户端(四)——添加多个账户及认证
- Android新浪微博客户端(二)——添加多个账户及认证
- Android新浪微博客户端(四)——添加多个账户及认证
- Android新浪微博开发(一)OAnth认证及账户管理、sdk的使用
- 新浪微博客户端 -- OAuth认证
- 新浪微博客户端 -- OAuth认证
- 一个完整的新浪微博客户端android版OAuth认证示例
- 一个完整的新浪微博客户端android版OAuth认证示例
- 新浪微博客户端开发之OAuth认证篇
- 新浪微博客户端开发之OAuth认证篇
- Android新浪微博客户端—开篇
- 新浪微博客户端开发详解(三)
- iOS 新浪微博客户端Demo实践之(一)OAuth2.0认证
- iOS 新浪微博客户端Demo实践之(一)OAuth2.0认证
- iOS 新浪微博客户端Demo实践之(一)OAuth2.0认证
- Android新浪微博客户端(二)——添加多个账户及认证
- Android ListView下拉刷新、上拉载入更多(改良版)
- Java annotation 注解
- 黑马程序员----------面向对象三个权限修饰符
- 一步一步写算法(之单向链表)
- Android新浪微博客户端(三)——添加多个账户及认证
- 转:一步一步写算法(之通用算法的编写)
- 常见Sqlite管理工具
- 一步一步写算法(之链表重合)
- eclipse 安装反编译工具 JadClipse
- uva 2553(n皇后)
- iOS之Object-c编程基础之NSString和NSMutableString
- POJ-1523-SPF
- 【LeetCode】Triangle