1. 程式人生 > >Android實現新浪微博SSO授權登入分享文字圖片等功能(WEIBO_ANDROID_SDK V2.3.0 )

Android實現新浪微博SSO授權登入分享文字圖片等功能(WEIBO_ANDROID_SDK V2.3.0 )

新浪開發平臺:http://open.weibo.com

新浪微博分享目前分為兩種途徑:

1,直接在自己的APP,彈出類似Dialog(sina整合)來完成授權,授權成功後可直接分享內容,全程都是在自己APP裡完成分享。老版本的微博SDK中集成了彈出分享Dialog(WebView)的檢視,以及插入文字、圖片、URL等API,直接呼叫介面中的update就可以分享,此方法是在自己的APP中彈出類似Dialog的形式來完成的,分享的所有過程都在一個介面。

【APP分享-彈出sina封裝好的Dialog-(授權)--分享---Dialog消失】

2,最新版的微博SDK,建議移動開發者使用SSO授權機制,這種機制牽引使用者在分享時,跳轉到手機中的新浪微部落格戶端,然後授權驗證以及傳送微博。
【APP攜帶要分享的資料-----跳轉到微部落格戶端----(授權或登入)----分享-----返回APP】

如果使用老版本的SDK,程式碼量很少,就可以很簡單的分享一條微博,但是授權驗證時:Failed to receive access token,始終無法獲得授權token,初步認為sina不再支援這種方式了。

如果使用新版本的SDK,帶來的問題就是使用者的手機一定要安裝了 新浪微部落格戶端 否則無法分享。

本文是sina建議的SSO機制,APP間跳轉和回撥,跟著我的步驟走,讓你很快實現分享功能。

成為開發者

開啟新浪開發平臺,都應該有新浪微博賬號吧,登入好後,在網頁右上角點選個人資訊-編輯開發者資訊:


首先你要成為一名開發者,型別的話我選擇的是個人,公司性質還需要一系列稽核,很麻煩,我只是為了在APP裡實現分享功能,並不會延伸到支付等高階API,所以選擇了個人開發者,完成後會給郵箱發郵件,一系列的動作,相信你沒問題。(至於身份認證,需要上傳開發者證件,我認為無所謂,目前只是分享功能)

建立應用

開發平臺,點選管理中心,在這個介面我們需要建立一個應用,以供sina識別我們自己的APP。


sina說的很明確了,建立一個應用,得到appkey,就能測試了,至於之後的稽核、上線,就看你的需求了,不需要稽核,就可以實現分享的功能

建立應用

建立應用-移動APP應用地址什麼之類的可以隨意寫(如果你只是demo)。

編輯應用

建立好後,記住APP_KEY,這是你身份標識,然後編輯應用:

你的APP是什麼包名,這裡就填什麼,不一致的話,不能通過驗證。

Android簽名是sina讓你使用它的APk,輸入包名,生成一個唯一的MD5校驗碼


http://open.weibo.com/wiki/SDK

 尋找Android SDK,下載下來,開啟後有一個app_signatures.apk,部署到手機裡,執行生成一個DM5簽名,複製到網頁中來。

Android下載地址就無所謂了,可以隨意寫。

高階資訊

開啟高階資訊,編輯OAuth2.0 授權設定,因為是移動APP,我們要填寫一個授權回撥頁,否則獲取不到access_token,在這裡我填寫的是www.sina.com,【注意哦,這裡填寫什麼,專案中的REDIRECT_URL的值就是什麼,這倆得保持一直,否則驗證不通過,就會遇到error:redicect_uri_mismatch 錯誤】,取消授權頁這裡可以什麼都不輸入,目前用不到。


關聯賬號

開啟測試賬號,輸入自己的微博名稱,關聯一下,到此為止,已經成功了一半。


開發測試

匯入jar包

把下載好的weibo_sdk.jar匯入到專案中的libs。

 配置跳轉Action

在AndroidManifest.xml中,在需要接受訊息(微博APP分享成功返回到自己APP)的類裡宣告對應的Action:

com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY如下程式碼:

     <activity
            android:name=".DemoActivity"
            android:configChanges="keyboardHidden|orientation"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Black.NoTitleBar" >
            
            <intent-filter>
                <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY"/>
                <category android:name="android.intent.category.DEFAULT"/>
                
            </intent-filter>
            
            
        </activity>
對應的Activity要實現IWeiboHandler.Response介面


初始化

	protected Weibo mWeibo;
	public static final String WEIBO_KEY = "你的APP_KEY";
	public static final String REDIRECT_URL = "http://www.sina.com";//【和網站自己設定的回撥頁保持一致】

	public Oauth2AccessToken mAccessToken;
	public IWeiboAPI weiboApi;
	protected Bitmap mSharedPic;
	protected SsoHandler mSsoHandler;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// TODO init
		mWeibo = Weibo.getInstance(WEIBO_KEY, REDIRECT_URL, null);
		weiboApi = WeiboSDK.createWeiboAPI(AppMain.this, WEIBO_KEY);
		weiboApi.responseListener(getIntent(), this);
String path = Environment.getExternalStorageDirectory().toString()
+ "/test.png";
mSharedPic = BitmapFactory.decodeFile(path);
		
	}

Callback

在onCreate()和onNewIntent里加入weiboApi.responseListener(intent,this);

	@Override
	protected void onNewIntent(Intent intent) {
		super.onNewIntent(intent);
		weiboApi.responseListener(intent, this);
	}

當從微博發博器介面返回到該 Activity時 , 接 口 函 數 IWeiboHandler.Response.onResponse(...)會被呼叫,使用者可以從該函式內獲取成功或失敗,以及取消的資訊,如下:

	/**
	 * 當從微博返回到該Activity時,此介面函式會被呼叫
	 */
	@Override
	public void onResponse(BaseResponse baseResp) {
		switch (baseResp.errCode) {
		case com.sina.weibo.sdk.constant.Constants.ErrorCode.ERR_OK:
			Toast.makeText(this, "分享成功", Toast.LENGTH_LONG).show();
			break;
		case com.sina.weibo.sdk.constant.Constants.ErrorCode.ERR_FAIL:
			Toast.makeText(this, baseResp.errMsg + "分享失敗!", Toast.LENGTH_LONG)
					.show();
			break;
		case com.sina.weibo.sdk.constant.Constants.ErrorCode.ERR_CANCEL:
			Toast.makeText(this, "取消分享", Toast.LENGTH_LONG).show();
			break;
		}
	}

在onActivityResult里加入回撥函式

當用戶點選分享按鈕時,會進行SSO  登入,登陸完成後,返回該Activity,此時,我們需要在 onActivityResult(…)中呼叫 mSsoHandler.authorizeCallBack(requestCode, 
resultCode,  data) 函式,整個登陸才能結束。授權成功後,SDK會預設通過 AccessTokenKeeper 將access_token、expires_in資訊其儲存到SharedPreference 裡面, 
用 戶 也 可 在 onComplete函 數中通過

 Oauth2AccessToken        token  =   AccessTokenKeeper.readAccessToken(getApplicationContext()); 獲得 access_token 、 expires_in 資訊。 

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if (mSsoHandler != null) {
			mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
		}
	}

實現WeiboAuthListener 介面 

授權成功後,SDK 會預設通過AccessTokenKeeper 將access_token、expires_in 資訊其儲存到SharedPreference 裡面,第三方也可在onComplete 函式中獲得access_token、expires_in資訊。具體如何儲存和使用access_token 資訊由開發者自行處理。 

	/***
	 * 實現WeiboAuthListener介面,返回授權結果
	 * 通過access_token和expires_in獲取accesstoken
	 * @author Administrator
	 *
	 */
	class AuthDialogListener implements WeiboAuthListener {

		@Override
		public void onCancel() {
			Toast.makeText(this, "Auth onCancel", Toast.LENGTH_LONG).show();
		}
		
		@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()) {
				AccessTokenKeeper.keepAccessToken(this, mAccessToken);
				Toast.makeText(this, "授權認證成功!", Toast.LENGTH_LONG).show();
				// TODO
				reqMsg(mSharedPic);
			}
		}

		@Override
		public void onError(WeiboDialogError arg0) {
			Toast.makeText(this, "授權失敗:" + arg0.getMessage(), Toast.LENGTH_LONG)
					.show();
		}

		@Override
		public void onWeiboException(WeiboException arg0) {
			Toast.makeText(this, "Auth Exception:" + arg0.getMessage(),
					Toast.LENGTH_LONG).show();
		}

	}

呼叫authorize 方法,認證並授權 

呼叫Weibo.authorize(…)方法,彈出授權對話方塊,進行授權。授權成功後即可獲得 access_token。 

在分享的按鈕事件裡新增驗證:

	@Override
	public void onClick(View v) {
		mAccessToken = AccessTokenKeeper.readAccessToken(AppMain.this);

		if (mAccessToken.isSessionValid()) {
			// TODO發微博
			reqMsg(mSharedPic);
		} else {
			/** 不使用SSO方式進行授權驗證 */
			// mWeibo.anthorize(AppMain.this, new AuthDialogListener());

			/** 使用SSO方式進行授權驗證 */
			mSsoHandler = new SsoHandler(this, mWeibo);
			mSsoHandler.authorize(new AuthDialogListener(), null);
		}

	}

分享微博

	/**
	 * 向weibo 客戶端註冊傳送一個攜帶:文字、圖片等資料
	 * 
	 * @param bitmap
	 */
	public void reqMsg(Bitmap bitmap) {

		weiboApi.registerApp();

		/*圖片物件*/
		ImageObject imageobj = new ImageObject();

		if (bitmap != null) {
			imageobj.setImageObject(bitmap);
		}

		/*微博資料的message物件*/
		WeiboMultiMessage multmess = new WeiboMultiMessage();
		TextObject textobj = new TextObject();
		textobj.text = "這是我的測試微博分享訊息,大家看的到嗎?";

		multmess.textObject = textobj;
		multmess.imageObject = imageobj;
		/*微博傳送的Request請求*/
		SendMultiMessageToWeiboRequest multRequest = new SendMultiMessageToWeiboRequest();
		multRequest.multiMessage = multmess;
		//以當前時間戳為唯一識別符
		multRequest.transaction = String.valueOf(System.currentTimeMillis());
		weiboApi.sendRequest(this, multRequest);
	}


執行效果圖:

授權


SSO模式的授權


登入


分享


分享成功返回自己APP


網頁微博效果


weiboSDK老版本和新版本區別:


答案是,新版本已經把類似StatusesAPI這種封裝給取消了,也就是說,如果想不跳轉微部落格戶端來分享,在自己APP裡直接分享,就需要自己寫StatusesAPI,呼叫微博api介面,實現分享。

到此為止,微博分享就成功啦,遇到errorcode千萬不要著急頭大,靜下心來去openweibo看錯誤碼標識,弄懂流程很容易就可以通過授權了,分享是最基本功能,以後還有很多介面可以呼叫,大家有什麼問題或心得就在這裡交流就可以哦~~