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算是初步入门了吧,刚好最近对微博感兴趣就 ...
随机推荐
- stl_alloc.h
/* * Copyright (c) 1996-1997 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, ...
- Java基础知识强化之IO流笔记10:File类输出指定目录下指定后缀名的文件名称案例(File类的文件过滤器方法改进list( FilenameFilter ff))
1. 案例: 判断F盘下是否有后缀名为.jpg的文件,如果有的话,就输出这个文件名. 2. 案例代码如下: (1)思路是:先获取所有的文件和文件夹封装的对象,然后遍历的时候,依次判断,如果满足条件就输 ...
- android中的文件操作详解以及内部存储和外部存储(转载)
原文链接:http://m.blog.csdn.net/article/details?id=17725989 摘要 其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安 ...
- ST表poj3264
/* ST表多次查询区间最小值 设 g[j][i] 表示从第 i 个数到第 i + 2 ^ j - 1 个数之间的最小值 类似DP的说 ans[i][j]=min (ans[i][mid],ans ...
- shijan
1.<?php 2. $zero1=date(“y-m-d h:i:s”); 3. $zero2=”2010-11-29 21:07:00′; 4. echo “zero1的时间为:”.$zer ...
- (转)JavaWeb学习总结(十三)——使用Session防止表单重复提交
如何防止表单重复提交 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复 ...
- Js 通过点击改变css样式
通过js 点击按钮去改变目标原始的背景颜色 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> ...
- 千万数量级分页存储过程 +AspNetPager现实分页
存储过程 USE [ForeignTradeDB] GO /****** Object: StoredProcedure [dbo].[CommonGetDataPager] Script Date: ...
- Windows 2008 server R2安装.NET Framework4时提示“灾难性故障”解决
在安装行环境.NET Framework 4时无法安装,提示“灾难性故障”.服务器的操作系统是windows server 2008 R2. 查看系统日志时显示“无法安装 Windows 更新 &q ...
- MemCache缓存和C#自带的Cache缓存
1.MemCache: //初始化 static SockIOPool _pool; // 创建Memcached private static MemcachedClient Create(stri ...