準備,分析:
要做新浪授權重要的是申請到App Key
新浪微博官方Demo(一定要仔細閱讀內涵pdf文件)
以上紅色圈中的一定要進行填寫,否則會授權失敗!app secret的獲取可能比較繞一點,但我覺得還是有必要這麼做的,具體做法:
1.一定要先把你要授權的用戶現在手機上運行一遍,確保手機裏有你要授權的用戶
2.安裝官方的MD5簽名生成器,填寫包名之後會出現MD5簽名之後複製到app secret,附圖
之後再配置類裏面配置相關信息:
具體可參考官方提供的demo,再次強調下官方提供的demo不是不能用,只是你的key不對,有很多童鞋瞎抱怨,官方的pdf裏面也有詳細申請流程,仔細閱讀每個細節,別把時間浪費在不必要的事情上,希望這篇文章能對你有所幫助!!!
開始,構建 :
//===============本篇文章重點類 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 = "獲取數據有誤"; }
結束,分享
昨天剛開寫第一篇文章,很榮幸的被51cto被評爲推薦博文,有點小激動啊,給了我不少的動力,希望我能堅持寫下去吧,膜拜各位大神!!!