在上一篇文章, 我们封装了三方登录的功能,三方分享需要依赖腾讯的 SDK ,可参考上一篇文章 前期准备 部分,还没看过上一篇的朋友,建议先去阅读 一步步实现三方操作功能模块封装(一),三方登录
在多数情况下,我们希望在分享一则消息到 QQ 或者 微信时,只需要调用一行代码就能实现,如下所示:
//分享默认方法
public static void shareDefault(Activity context,String shareTitle, String shareContent,String shareUrl,String imageUrl, DataListener callback) {
}
或者想要指定分享的平台,例如只分享到微信,如下所示:
//指定某个平台分享
public static void assignSharePlatform(Activity context,String shareTitle, String shareContent,String shareUrl,String imageUrl, String platformName,DataListener callback){
}
按照这样的要求,我们一步一步来搭建自己三方分享模块。
实现思路
按照以往套路,先看分享操作结构图
QQ 分享
QQ 分享结构图,如下所示
QQ 分享结构图分析
ShareUtil 工具类提供各种类型的分享方法,例如上面说到的 shareDefault ( ) 默认分享方法 或者 assignSharePlatform( ) 指定平台分享方法,亦可根据项目需要定义新的方法。这是对我们封装的分享模块方法的再次封装,它可以起到隔离底层实现的作用,也方便使用者的调用。
ThirdPlatformShareUtil 是我们自己的三方分享模块对外提供分享接口的工具类,它对外提供统一 share() 分享方法,根据分享平台和分享的内容选择 ThirdPlatformShareHandler 不同分享请求方法,这样做的目的是让我们三方分享模块根据入参匹配调用相应的分享方法,对外层提供统一的接口,这就是 门面模式 的思想。
ThirdPlatformShareHandler 负责检查分享的参数和按照 QQ 文档接口要求填写分享内容,QQ 分享细分为分享图文、分享纯图片、分享音乐等类型,每个类型都有自己填写格式和必填参数,填写不规范导致分享失败或者程序奔溃,我们当然希望提高自身分享的成功率,若分享参数有误,还能够提前暴露问题,不至于整个程序奔溃,影响用户体验。还有 QQ 分享需要依赖界面,否则无法收到 QQ 回调信息,发送分享请求放在 UiControlActivity 操作(按照分析,QQ 分享是不需要依赖 UI ,这里还没研究出来,暂时先这样处理)。
UiControlActivity 根据分享类型发送 QQ 分享请求(还记得我们 QQ 登录发送请求嘛,没错,也是调用同样的方法,只是换了请求类型)。
QQ 处理请求后,通过回调通知 UiControlActivity 分享结果,UiControlActivity 再回调给 ThirdPlatformShareUtil ,若是不依赖界面,就不用经过 UiControlActivity 这一层了。
微信分享
微信分享结构图
微信分享结构图解析
- 微信分享结构与 QQ 分享结构很相似。因为微信分享不依赖 UI ,我们使用 WxHandleRequest 统一发送分享请求,上一篇文章微信登录请求也是在这里发送的。
- 微信处理分享请求后回调 WXEntryActivity onResp( ) 方法,我们再回调通知 ThirdPlatformShareUtil 。
代码实现
QQ 分享
ThirdPlatformShareHandler 类
分析 QQ 分享接口
点击查看 分享消息到 QQ 接口文档
以分享图文消息到 QQ 为例子,代码如下所示:final Bundle params = new Bundle(); params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT); params.putString(QQShare.SHARE_TO_QQ_TITLE, "要分享的标题"); params.putString(QQShare.SHARE_TO_QQ_SUMMARY, "要分享的摘要"); params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, "http://www.qq.com/news/1.html";); params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL,"http://imgcache.qq.com/qzone/space_item/pre/0/66768.gif";); params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "测试应用222222"); params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, "其他附加功能"); mTencent.shareToQQ(MainActivity.this, params, new BaseUiListener());
代码相对简单,先准备 Bundle 类型 的分享数据,按照 key-value 形式填入数据,如标题、跳转链接。然后调用 shareToQQ( ) 方法,第二个入参是分享数据,第三个入参是分享结果的回调。
分享接口的 params 参数说明,如下所示:
说明规定哪些参数是必填,哪些参数可选。若是必填参数为 null ,导致分享失败,有时还会导致程序奔溃,那我们很有必要在调用分享接口前检查分享参数,提高分享成功率。
分享 QQ 消息还有 分享到纯图片,分享音乐等类型,使用规则和分享图文消息类似,那么这些类型都可以分装成同一个方法,变化的只有 Bundle 类型的分享内容。
分享到 QQ 空间接口,代码如下:
private void shareToQzone () { //分享类型 params.putString(QzoneShare.SHARE_TO_QQ_KEY_TYPE,SHARE_TO_QZONE_TYPE_IMAGE_TEXT ); params.putString(QzoneShare.SHARE_TO_QQ_TITLE, "标题");//必填 params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, "摘要"