android 仿新浪微博授權篇

準備,分析:


要做新浪授權重要的是申請到App Key

新浪微博開放平臺

新浪微博官方Demo(一定要仔細閱讀內涵pdf文件)

231700263.jpg

231702346.jpg

以上紅色圈中的一定要進行填寫,否則會授權失敗!app secret的獲取可能比較繞一點,但我覺得還是有必要這麼做的,具體做法:

1.一定要先把你要授權的用戶現在手機上運行一遍,確保手機裏有你要授權的用戶

2.安裝官方的MD5簽名生成器,填寫包名之後會出現MD5簽名之後複製到app secret,附圖

232352513.jpg

之後再配置類裏面配置相關信息:

232527478.jpg

具體可參考官方提供的demo,再次強調下官方提供的demo不是不能用,只是你的key不對,有很多童鞋瞎抱怨,官方的pdf裏面也有詳細申請流程,仔細閱讀每個細節,別把時間浪費在不必要的事情上,希望這篇文章能對你有所幫助!!!


開始,構建 :


231308524.jpg

233444495.jpg

//===============本篇文章重點類 SinaAccess

/**
 * 新浪微博授權
 * @author Johnny
 *
 */
public class SinaAccess {
              
    private static SinaAccess sinaAccess;
              
    /** 微博API接口類,提供登陸等功能  */
    private Weibo mWeibo;
              
    /** 封裝了 "access_token","expires_in","refresh_token",並提供了他們的管理功能  */
    private Oauth2AccessToken mAccessToken;
              
    /** 注意:SsoHandler 僅當sdk支持sso時有效 */
    private SsoHandler mSsoHandler;
              
    /** 上下文*/
    private Activity mContext;
              
    private static Handler mHandler;
              
    private SinaAccess(){
        mWeibo = Weibo.getInstance(AppConfig.APP_KEY, AppConfig.REDIRECT_URL, AppConfig.SCOPE);
    }
              
    public static SinaAccess getInstance(Handler mHandler){
        setmHandler(mHandler);
        if(null==sinaAccess){
            sinaAccess=new SinaAccess();
            return sinaAccess;
        }
        return sinaAccess;
    }
              
              
    public static Handler getmHandler() {
        return mHandler;
    }
              
    public static void setmHandler(Handler mHandler) {
        SinaAccess.mHandler = mHandler;
    }
              
    /**
     * 判斷是否授權成功
     */
    public void getAuthorize(Activity mContext){
        // 從 SharedPreferences 中讀取上次已保存好 AccessToken 等信息,
        // 第一次啓動本應用,AccessToken 不可用
        this.mContext=mContext;
        mAccessToken = AccessTokenKeeper.readAccessToken(mContext);
        if (mAccessToken.isSessionValid()) {
            /*String date = new java.text.SimpleDateFormat("yyyy/MM/dd hh:mm:ss")
                    .format(new java.util.Date(mAccessToken.getExpiresTime()));
            Toast.makeText(mContext, "access_token 仍在有效期內,無需再次登錄: \naccess_token:"
                    + mAccessToken.getToken() + "\n有效期:" + date , Toast.LENGTH_SHORT).show();*/
            mHandler.sendEmptyMessage(AppConfig.OAUTH_SUCCEED);
            AccessTokenKeeper.keepAccessToken(mContext, mAccessToken);
        }else{
            Logger.d("授權未找到");
        }
    }
              
    /**
     * 普通授權
     */
    public void authorize(){
        mWeibo.anthorize(mContext, new AuthDialogListener());
    }
              
    /**
     * SSO 授權調用
     */
    public void ssoAuthorize(){
        mSsoHandler = new SsoHandler(mContext, mWeibo);
        mSsoHandler.authorize(new AuthDialogListener(), null);
    }
              
    /**
     * SSO 授權回調    重要:發起 SSO 登陸的Activity必須重寫onActivityResult
     * 注:使用SSO登錄前,請檢查手機上是否已經安裝新浪微博客戶端,"
                    + "目前僅3.0.0及以上微博客戶端版本支持SSO;如果未安裝,將自動轉爲Oauth2.0進行認證
     * @param requestCode
     * @param resultCode
     * @param data
     */
    public void  ssoAuthorizeCallBack(int requestCode, int resultCode, Intent data){
        if (mSsoHandler != null) {
            mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
        }
    }
              
    /**
     * 微博認證授權回調類。
     * 1. SSO登陸時,需要在{@link #onActivityResult}中調用mSsoHandler.authorizeCallBack後,
     *    該回調纔會被執行。
     * 2. 非SSO登陸時,當授權後,就會被執行。
     * 當授權成功後,請保存該access_token、expires_in等信息到SharedPreferences中。
     */
    class AuthDialogListener implements WeiboAuthListener {
                  
        @Override
        public void onComplete(Bundle values) {
            String token = values.getString("access_token");
            String expires_in = values.getString("expires_in");
            mAccessToken = new Oauth2AccessToken(token, expires_in);
            if (mAccessToken.isSessionValid()) {
                /*String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
                        .format(new java.util.Date(mAccessToken.getExpiresTime()));
                Toast.makeText(mContext, "認證成功: \r\n access_token: " + token + "\r\n" + "expires_in: "
                        + expires_in + "\r\n有效期:" + date , Toast.LENGTH_SHORT).show();*/
                mHandler.sendEmptyMessage(AppConfig.OAUTH_COMPLETE);
                AccessTokenKeeper.keepAccessToken(mContext, mAccessToken);
            }else{
                Logger.d("授權未找到");
            }
        }
        @Override
        public void onError(WeiboDialogError e) {
            Logger.e(e.getMessage());
            /*Toast.makeText(mContext,
                    "Auth error : " + e.getMessage(), Toast.LENGTH_LONG).show();*/
        }
        @Override
        public void onCancel() {
            Logger.d("Auth cancel");
            /*Toast.makeText(mContext, "Auth cancel", Toast.LENGTH_LONG).show();*/
        }
        @Override
        public void onWeiboException(WeiboException e) {
            Logger.d(e.getMessage());
            /*Toast.makeText(mContext,
                    "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();*/
        }
    }
}

//============================LoginActivity

/**
 * 新浪授權登陸頁面
 * @author Johnny
 *
 */
public class LoginActivity extends BaseActivity{
                
    private Button mLoginBtn;
                
    /**新浪微博授權*/
    private SinaAccess sinaAccess;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        init();
    }
                
    private void init(){
        /**新浪微博授權類初始化*/
        sinaAccess=SinaAccess.getInstance(myHandler);
        /**一定要調用該方法(返回是否授權成功)*/
        sinaAccess.getAuthorize(this);
                    
        mLoginBtn=(Button) findViewById(R.id.btn_login);
                    
        mLoginBtn.setOnClickListener(btnOnClickListener());
                    
    }
                
    private void enter(){
        Intent intent = new Intent(this, KKsinaActivity.class);
        startActivity(intent);
        finish();
    }
    @Override
    protected void getMessage(Message msg) {
        // TODO Auto-generated method stub
        switch (msg.what) {
        case AppConfig.OAUTH_SUCCEED:
            enter();
            break;
        case AppConfig.OAUTH_COMPLETE:
            toastShow("認證成功");
            enter();
            break;
        case AppConfig.OAUTH_ERROR:
        case AppConfig.OAUTH_CANCEL:
        case AppConfig.OAUTH_WEIBO_EXCEPTION:
            toastShow("認證失敗,查看Log日誌輸出具體分析錯誤");
            break;
        }
        super.getMessage(msg);
    }
                
    private OnClickListener btnOnClickListener() {
        return new View.OnClickListener() {
                        
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                /*sinaAccess.authorize();//普通授權*/             
                sinaAccess.ssoAuthorize();//SSO 授權
            }
        };
    }
                
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Logger.d("SSO授權返回調用");
        //SSO 授權回調    重要:發起 SSO 登陸的Activity必須重寫onActivityResult
        sinaAccess.ssoAuthorizeCallBack(requestCode, resultCode, data);
    }
                
                
}

//=====================AppConfig

/**
 * 應用配置類
 * @author Johnny
 *
 */
public class AppConfig {
                                                                               
    // 應用的key 請到官方申請正式的appkey替換APP_KEY
//  public static final String APP_KEY      = "1509943602";//公司
    public static final String APP_KEY      = "1452755821";//筆記本
    // 替換爲開發者REDIRECT_URL
    public static final String REDIRECT_URL = "http://down.51cto.com/data/983705";
    // 新支持scope:支持傳入多個scope權限,用逗號分隔
    public static final String SCOPE =
            "email,direct_messages_read,direct_messages_write,"
            + "friendships_groups_read,friendships_groups_write,statuses_to_me_read,"
            + "follow_app_official_microblog," + "invitation_write";
    public static final String CLIENT_ID         = "client_id";
    public static final String RESPONSE_TYPE     = "response_type";
    public static final String USER_REDIRECT_URL = "redirect_uri";
    public static final String DISPLAY           = "display";
    public static final String USER_SCOPE        = "scope";
    public static final String PACKAGE_NAME      = "packagename";
    public static final String KEY_HASH          = "key_hash";
                                                                               
                                                                               
                                                                               
    public final static int SHWO_PROGRESS=0;//顯示進度對話框
    public final static int HIDE_PROGRESS=1;//隱藏進度對話框
    public final static int DISS_PROGRESS=2;//關閉進度對話框
    public final static int OAUTH_SUCCEED=3;//已經授權成功,直接進入主頁面
    public final static int OAUTH_COMPLETE=4;//授權登陸成功
    public final static int OAUTH_ERROR=5;//授權登陸錯誤
    public final static int OAUTH_CANCEL=6;//授權登陸取消
    public final static int OAUTH_WEIBO_EXCEPTION=7;//授權登陸微博異常
    public final static int NET_ERR_SHOW=600;//網絡異常
    public final static int DATA_ERR_SHOW=500;//數據異常
                                                                               
    public final static String NET_ERR = "網絡有誤,請檢查網絡";
    public final static String DATA_ERR = "獲取數據有誤";
}


結束,分享



KKsina



昨天剛開寫第一篇文章,很榮幸的被51cto被評爲推薦博文,有點小激動啊,給了我不少的動力,希望我能堅持寫下去吧,膜拜各位大神!!!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章