本篇在基于之前封裝的SocialSDK的項(xiàng)目上增加了新浪微博 SDK的登錄授權(quán)和分享谱净。介紹了新浪微博登錄分享的接入和使用注意事項(xiàng)。
具體代碼項(xiàng)目Github地址:https://github.com/tsy12321/SocialSDKAndroid
0 系列文章
系列一 Android SDK的二次封裝和使用
系列二 源碼解析
系列三 微信SDK接入
系列四 QQ SDK接入
系列五 新浪微博 SDK接入
1 官方文檔
新浪微博官方SDK:
https://github.com/sinaweibosdk/weibo_android_sdk
API WIKI(授權(quán)成功后可以使用access_token去調(diào)用接口獲取數(shù)據(jù)):
http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI
2 新浪微博SDK說明
和 微信和QQ SDK不同亭姥,新浪微博SDK包含2個(gè)三圆,一個(gè)是weiboSDKCore_3.1.4.jar, 還有一個(gè)是所有的so庫(kù)。
需要同時(shí)引用蒜绽。引用so庫(kù)的方法如下
將所有so文件統(tǒng)一放到項(xiàng)目的目錄app/jniLibs中(和libs同級(jí)), 然后在gradle中加上
android {
...
//引入微博的所有so庫(kù)
sourceSets {
main {
jniLibs.srcDirs = ['jniLibs']
}
}
}
3 集成登錄授權(quán)
在之前的框架里創(chuàng)建一個(gè)SinaWBHandler,并且在PlatformType桶现、PlatformConfig增加新浪微博的配置類型躲雅。
然后在SinaWBHandler先初始化mAuthInfo:
this.mAuthInfo = new AuthInfo(mContext, mConfig.appKey, REDIRECT_URL, SCOPE);
授權(quán)登錄時(shí)調(diào)用:
mSsoHandler.authorize(new WeiboAuthListener() {
@Override
public void onComplete(Bundle bundle) {
// 從 Bundle 中解析 Token
Oauth2AccessToken accessToken = Oauth2AccessToken.parseAccessToken(bundle);
if(accessToken.isSessionValid()) {
Map<String, String> map = new HashMap<String, String>();
map.put("uid", accessToken.getUid());
map.put("access_token", accessToken.getToken());
map.put("refresh_token", accessToken.getRefreshToken());
map.put("expire_time", "" + accessToken.getExpiresTime());
mAuthListener.onComplete(mConfig.getName(), map);
} else {
String errmsg = "errmsg=accessToken is not SessionValid";
LogUtils.e(errmsg);
mAuthListener.onError(mConfig.getName(), errmsg);
}
}
@Override
public void onWeiboException(WeiboException e) {
String errmsg = "errmsg=" + e.getMessage();
LogUtils.e(errmsg);
mAuthListener.onError(mConfig.getName(), errmsg);
}
@Override
public void onCancel() {
mAuthListener.onCancel(mConfig.getName());
}
});
最后返回access_token, uid等數(shù)據(jù)給使用sdk用戶骡和,用戶可以保存或者直接使用access_token去調(diào)用新浪微博的API獲取各種新浪微博數(shù)據(jù)相赁。
回調(diào)處理,直接在SinaWBHandler中實(shí)現(xiàn)onActivityResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
3 分享
新浪微博的分享有幾個(gè)注意點(diǎn)慰于。在新浪微博SDK接入說明中钮科,
發(fā)起分享的Activity的AndroidManifest中要添加以下代碼
<activity android:name="com.tsy.girl.MainActivity"> <!--發(fā)起分享的Activity-->
<!--增加的代碼-->
<intent-filter>
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
發(fā)起分享的Activity要實(shí)現(xiàn)IWeiboHandler.Response接口,并且重寫onNewIntent婆赠,在onNewIntent中要調(diào)用新浪微博的SDK方法绵脯,才能正確回調(diào)。
于是我們提供封裝的SDK要求用戶在這幾個(gè)地方主動(dòng)調(diào)用SinaWBHandler的方法休里,具體的處理在SinaWBHandler中進(jìn)行處理桨嫁,詳細(xì)可以見系列一文章的新浪微博接入說明。
!!在這里注意一點(diǎn)份帐,實(shí)現(xiàn)IWeiboHandler.Response的必須是Activity方法,新浪微博SDK中會(huì)判斷如果instantof Activity楣导, 在這新浪微博的SDK沒有進(jìn)行說明废境, 如果不是Activity會(huì)收不到分享回調(diào)
具體的分享代碼可以直接參見新浪微博SDK的說明,5種媒介都可以實(shí)現(xiàn)筒繁,集成的代碼如下:
@Override
public void share(Activity activity, IShareMedia shareMedia, ShareListener shareListener) {
this.mActivity = activity;
this.mShareListener = shareListener;
this.mSsoHandler = new SsoHandler(mActivity, mAuthInfo);
WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
if(shareMedia instanceof ShareWebMedia) { //網(wǎng)頁(yè)分享
ShareWebMedia shareWebMedia = (ShareWebMedia) shareMedia;
WebpageObject mediaObject = new WebpageObject();
mediaObject.identify = Utility.generateGUID();
mediaObject.title = shareWebMedia.getTitle();
mediaObject.description = shareWebMedia.getDescription();
mediaObject.setThumbImage(shareWebMedia.getThumb());
mediaObject.actionUrl = shareWebMedia.getWebPageUrl();
weiboMessage.mediaObject = mediaObject;
} else if(shareMedia instanceof ShareTextMedia) { //文字分享
ShareTextMedia shareTextMedia = (ShareTextMedia) shareMedia;
TextObject textObject = new TextObject();
textObject.text = shareTextMedia.getText();
weiboMessage.textObject = textObject;
} else if(shareMedia instanceof ShareImageMedia) { //圖片分享
ShareImageMedia shareImageMedia = (ShareImageMedia) shareMedia;
ImageObject imageObject = new ImageObject();
imageObject.setImageObject(shareImageMedia.getImage());
weiboMessage.imageObject = imageObject;
} else if (shareMedia instanceof ShareMusicMedia) { //音樂分享
ShareMusicMedia shareMusicMedia = (ShareMusicMedia) shareMedia;
MusicObject musicObject = new MusicObject();
musicObject.identify = Utility.generateGUID();
musicObject.title = shareMusicMedia.getTitle();
musicObject.description = shareMusicMedia.getDescription();
musicObject.setThumbImage(shareMusicMedia.getThumb());
musicObject.actionUrl = shareMusicMedia.getMusicUrl();
musicObject.dataUrl = shareMusicMedia.getMusicUrl();
musicObject.dataHdUrl = shareMusicMedia.getMusicUrl();
musicObject.duration = 10;
musicObject.defaultText = "music 默認(rèn)文案";
weiboMessage.mediaObject = musicObject;
} else if(shareMedia instanceof ShareVideoMedia) { //視頻分享
ShareVideoMedia shareVideoMedia = (ShareVideoMedia) shareMedia;
VideoObject videoObject = new VideoObject();
videoObject.identify = Utility.generateGUID();
videoObject.title = shareVideoMedia.getTitle();
videoObject.description = shareVideoMedia.getDescription();
videoObject.setThumbImage(shareVideoMedia.getThumb());
videoObject.actionUrl = shareVideoMedia.getVideoUrl();
videoObject.dataUrl = shareVideoMedia.getVideoUrl();
videoObject.dataHdUrl = shareVideoMedia.getVideoUrl();
videoObject.duration = 10;
videoObject.defaultText = "Vedio 默認(rèn)文案";
weiboMessage.mediaObject = videoObject;
} else {
if(this.mShareListener != null) {
this.mShareListener.onError(this.mConfig.getName(), "shareMedia error");
}
return ;
}
SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
request.transaction = String.valueOf(System.currentTimeMillis()); request.multiMessage = weiboMessage;
mWeiboShareAPI.sendRequest(mActivity, request);
}
回調(diào)處理:
public void onNewIntent(Intent intent, IWeiboHandler.Response response) {
mWeiboShareAPI.handleWeiboResponse(intent, response);
}
public void onResponse(BaseResponse baseResponse) {
if(baseResponse!= null){
switch (baseResponse.errCode) {
case WBConstants.ErrorCode.ERR_OK:
if(this.mShareListener != null) {
this.mShareListener.onComplete(this.mConfig.getName());
}
break;
case WBConstants.ErrorCode.ERR_CANCEL:
if(this.mShareListener != null) {
this.mShareListener.onCancel(this.mConfig.getName());
}
break;
case WBConstants.ErrorCode.ERR_FAIL:
if(this.mShareListener != null) {
this.mShareListener.onError(this.mConfig.getName(), baseResponse.errMsg);
}
break;
}
}
}
結(jié)尾
以上即實(shí)現(xiàn)了新浪微博的接入噩凹。至此,該社會(huì)化分享組件完成了微信毡咏、QQ驮宴、新浪微博的授權(quán)登錄和分享的集成。相對(duì)于Umeng等第三方來說呕缭,沒有將app_secret放到客戶端堵泽,獲取到access_token后直接返回修己,讓服務(wù)端去處理。增加了安全性迎罗。也方便以后擴(kuò)展定制睬愤。(之前用UMeng的社會(huì)化組件必須傳入app_secret)
*** PS:之前還集成過FaceBook、Twitter纹安、Google尤辱,糾結(jié)要不要加進(jìn)去。感覺國(guó)內(nèi)基本上不會(huì)用到厢岂。光督。。歡迎來Github提issue和fork塔粒,star***