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下載地址就無所謂了,可以隨意寫。
高階資訊
開啟高階資訊,編輯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看錯誤碼標識,弄懂流程很容易就可以通過授權了,分享是最基本功能,以後還有很多介面可以呼叫,大家有什麼問題或心得就在這裡交流就可以哦~~