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

本篇在基于之前封装的SocialSDK的项目上增加了新浪微博 SDK的登录授权和分享。介绍了新浪微博登录分享的接入和使用注意事项。

具体代码项目Github地址:https://github.com/tsy12321/SocialSDKAndroid

0 系列文章

系列一 Android SDK的二次封装和使用
系列二 源码解析
系列三 微信SDK接入
系列四 QQ SDK接入
系列五 新浪微博 SDK接入

1 官方文档

新浪微博官方SDK:

https://github.com/sinaweibosdk/weibo_android_sdk

API WIKI(授权成功后可以使用access_token去调用接口获取数据):

http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI

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***

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容