社會化登入分享-新浪微博 SDK接入

Tsy遠發表於2017-09-22

本篇在基於之前封裝的SocialSDK的專案上增加了新浪微博 SDK的登入授權和分享。介紹了新浪微博登入分享的接入和使用注意事項。

具體程式碼專案Github地址:github.com/tsy12321/So…

0 系列文章

系列一 Android SDK的二次封裝和使用
系列二 原始碼解析
系列三 微信SDK接入
系列四 QQ SDK接入
系列五 新浪微博 SDK接入

1 官方文件

新浪微博官方SDK:

github.com/sinaweibosd…

API WIKI(授權成功後可以使用access_token去呼叫介面獲取資料):

open.weibo.com/wiki/%E5%BE…

2 新浪微博SDK說明

和 微信和QQ SDK不同,新浪微博SDK包含2個,一個是weiboSDKCore_3.1.4.jar, 還有一個是所有的so庫。

需要同時引用。引用so庫的方法如下

將所有so檔案統一放到專案的目錄app/jniLibs中(和libs同級), 然後在gradle中加上

android {

    ...

    //引入微博的所有so庫
    sourceSets {
        main {
            jniLibs.srcDirs = ['jniLibs']
        }
    }
}複製程式碼

3 整合登入授權

在之前的框架裡建立一個SinaWBHandler,並且在PlatformType、PlatformConfig增加新浪微博的配置型別。

然後在SinaWBHandler先初始化mAuthInfo:

this.mAuthInfo = new AuthInfo(mContext, mConfig.appKey, REDIRECT_URL, SCOPE);複製程式碼

授權登入時呼叫:

 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等資料給使用sdk使用者,使用者可以儲存或者直接使用access_token去呼叫新浪微博的API獲取各種新浪微博資料。

回撥處理,直接在SinaWBHandler中實現onActivityResult

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}複製程式碼

3 分享

新浪微博的分享有幾個注意點。在新浪微博SDK接入說明中,

發起分享的Activity的AndroidManifest中要新增以下程式碼

<activity android:name="com.tsy.girl.MainActivity"> <!--發起分享的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>複製程式碼

發起分享的Activity要實現IWeiboHandler.Response介面,並且重寫onNewIntent,在onNewIntent中要呼叫新浪微博的SDK方法,才能正確回撥。

於是我們提供封裝的SDK要求使用者在這幾個地方主動呼叫SinaWBHandler的方法,具體的處理在SinaWBHandler中進行處理,詳細可以見系列一文章的新浪微博接入說明。

!!在這裡注意一點,實現IWeiboHandler.Response的必須是Activity方法,新浪微博SDK中會判斷如果instantof Activity, 在這新浪微博的SDK沒有進行說明, 如果不是Activity會收不到分享回撥

具體的分享程式碼可以直接參見新浪微博SDK的說明,5種媒介都可以實現,整合的程式碼如下:

@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) {       //網頁分享
        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 預設文案";

        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 預設文案";

        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);
}複製程式碼

回撥處理:

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;
        }
    }
}複製程式碼

結尾

以上即實現了新浪微博的接入。至此,該社會化分享元件完成了微信、QQ、新浪微博的授權登入和分享的整合。相對於Umeng等第三方來說,沒有將app_secret放到客戶端,獲取到access_token後直接返回,讓服務端去處理。增加了安全性。也方便以後擴充套件定製。(之前用UMeng的社會化元件必須傳入app_secret)

PS:之前還整合過FaceBook、Twitter、Google,糾結要不要加進去。感覺國內基本上不會用到。。。歡迎來Github提issue和fork,star

相關文章