原文出自:方杰|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新浪微博客户端(三)——添加多个账户及认证的更多相关文章

  1. android 新浪微博客户端的表情功能的实现

    这是一篇好文章,我转来收藏,技术的最高境界是分享. 最近在搞android 新浪微博客户端,有一些心得分享弄android客户端表情功能可以用以下思路1.首页把新浪的表情下载到本地一文件夹种,表情图片 ...

  2. Android新浪微博客户端(四)——添加多个账户及认证

    原文出自:方杰| http://fangjie.info/?p=75转载请注明出处 二.获取用户信息并保存数据库 上面说到加载AuthActivity有两种情况,其中一种就是授权成功回调,在授权回调成 ...

  3. Android新浪微博客户端(二)——添加多个账户及认证

    原文出自:方杰| http://fangjie.info/?p=69  转载请注明出处 先看下实现效果: 欢迎界面: 第一次进入登录界面登录由于在登录界面没有已授权用户信息,所以自动跳转到授权界面. ...

  4. Android新浪微博客户端(七)——ListView中的图片异步加载、缓存

    原文出自:方杰|http://fangjie.info/?p=193转载请注明出处 最终效果演示:http://fangjie.sinaapp.com/?page_id=54 该项目代码已经放到git ...

  5. Android新浪微博客户端(六)——Home界面的ListView

    原文出自:方杰|http://fangjie.info/?p=184转载请注明出处 最终效果演示:http://fangjie.info/?page_id=54该项目代码已经放到github:http ...

  6. 新浪微博客户端(8)-添加按钮到TabBar

    在tabBar的中部添加一个发送微博的按钮. DJTabBar.h #import <UIKit/UIKit.h> @class DJTabBar; @protocol DJTabBarD ...

  7. Android新浪微博客户端(五)——主界面的TabHost和WeiboUtil

    原文出自:方杰|http://fangjie.info/?p=183转载请注明出处 最终效果演示:http://fangjie.info/?page_id=54 该项目代码已经放到github:htt ...

  8. Android新浪微博客户端(一)——主框架搭建

    原文出自:方杰| http://fangjie.info/?p=62 转载请注明出处 提前声明的是,我是按照Ivan的这套教程学下来的. 首先,对于任何应用我们都需要建立一套消息处理机制,就是当用户在 ...

  9. android开发新浪微博客户端 完整攻略 [新手必读]

    开始接触学习android已经有3个礼拜了,一直都是对着android的sdk文档写Tutorials从Hello World到Notepad Tutorial算是初步入门了吧,刚好最近对微博感兴趣就 ...

随机推荐

  1. WWDC心愿单:新版OS X或将有这些变化

    每年的WWDC开发者大会上苹果都会展示最新的软件研发成果,在新一代MacBook Pro和MacBook Air笔记本到来之前,我们不妨来期待下新版OS X会有怎样的变化. Siri入驻Mac   此 ...

  2. 从 ReactiveCocoa 中能学到什么?不用此库也能学以致用

    从知道ReactiveCocoa开始就发现对这个库有不同的声音,上次参加<T>技术沙龙时唐巧对在项目中已全面使用FRP的代码家提出为什么这种编程模型出现了这么长时间怎么像ReactiveC ...

  3. Notice : Soft open files now is 1024, We recommend greater than 10000

    在研究 workerman 时, 报了这个错误, 感觉只是个notice级别的, 就一直给忽略掉了, 今天有时间, 就查了一下. 其实本质就是 ulimit 这个命令 打开一个命令行, 输入 ulim ...

  4. redis 多实例配置

    (redis的安装, 配置, 登陆等基础不再多说, 网上很多资料的, 这里只说个人对redis多实例的理解与配置) 我自己使用的redis版本是 2.8.13, 环境是 ubuntu 个人对多实例的理 ...

  5. 获取Html中所有img的src

    /// <summary> /// 获取所有Img中的Src /// </summary> /// <param name="htmlText"> ...

  6. 一段jquery代码,保存

    @CHARSET "UTF-8"; #table_id tbody tr.odd td:hover{ background-color:#93CFE5; } #table_id t ...

  7. web-请求无缓存

    <head><META HTTP-EQUIV="pragma" CONTENT="no-cache"><META HTTP-EQU ...

  8. RSA加密算法正确性证明

    RSA加密算法是利用大整数分解耗时非常大来保证加密算法不被破译. 密钥的计算过程为:首先选择两个质数p和q,令n=p*q. 令k为n的欧拉函数,k=ϕ(n)=(p−1)(q−1) 选择任意整数a,保证 ...

  9. 爬虫爬oj用户头像

    import requests import Queue import urllib import urllib2 import re import requests alreadyImg = set ...

  10. Android Studio删除Project

    最直截了当的方法是在Project所在目录直接删除整个Project,然后再次打开Android Studio的欢迎界面中把光标移到你的Project上,然后按键盘上的Delete键即可! 参考自st ...