原文出自:方杰|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. Android短信的发送和接收监听

    /**发送与接收的广播**/ String SENT_SMS_ACTION = "SENT_SMS_ACTION"; String DELIVERED_SMS_ACTION = & ...

  2. java多态---ABC案列

    class A{ public void show(){ show2(); } public void show2(){ System.out.println("我"); } } ...

  3. Bernese单点定位数据准备及处理

    原创作者 blog :http://yifeiyao.blog.163.com/blog/static/2058932752012669731170/1.准备所需用的数据文件,如下: 原始观测.O文件 ...

  4. python 之路,Day11(上) - python mysql and ORM

    python 之路,Day11 - python mysql and ORM   本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 ...

  5. C# - 二叉树表达式计算

    很早以前就写过双栈的表达式计算. 这次因为想深入学一下二叉树,网上都是些老掉牙的关于二叉树的基本操作. 感觉如果就学那些概念,没意思也不好记忆.于是动手写了一个表达式计算的应用例子. 这样学习印象才深 ...

  6. Oracle增加自增长列

    -- 移除索引drop index TB_1;drop index TB_2 ;alter table TB drop constraint PK_TB; --允许列为空 alter table TB ...

  7. 创建一个流(Stream)可以让Bitmap或Image保存到流里面(转)

    创建一个流(Stream)可以让Bitmap或Image使用save方法将已经在bitmap上生成的图像 保存到流里面?不需要直接在硬盘上生成文件 -------------------------- ...

  8. sql 列轉行、行轉列

    PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P ...

  9. Android Studio使用教程图文详解

    谷歌表示Android Studio 1.0 能让开发者“更快更有生产力”,并认为它可以代替 Eclipse,同时为Eclipse 用户提供迁移步骤.代码自动提示.运行响应速度.都比Eclipse来的 ...

  10. Linux CentOS6.4下Mysql数据库的安装与配置

    一.mysql简介 说到数据库,我们大多想到的是关系型数据库,比如mysql.oracle.sqlserver等等,这些数据库软件在windows上安装都非常的方便,在Linux上如果要安装数据库,咱 ...