最新版本(0.0.7) Easier 、Lighter 、 More Business-Oriented
以更简单、更轻量、更加面向业务需求为设计目标,提供 微博、微信、QQ、Tim、QQ 轻聊版、钉钉 的登陆分享功能支持;
项目地址 : GitHub - SocialSdkLibrary
博客地址 :快速接入微信微博QQ钉钉原生登录分享
🎉 2018.12.27 完成 gradle
插件,拆分平台,自动化依赖,一个新台阶 🐶
🎉 2018.12.21 已经225颗 🌟,着手准备拆分成不同平台库,方便灵活接入 ⛽️
🎉 2018.9.26 项目获得了第202颗 🌟,感谢新同事补星 2 个 😄
🎉 2018.6.7 项目获得了第100颗 🌟,最后一颗是我问同事要的 🤦
🎉 2018.5.12 修复内存问题、功能扩展 稳定版本 1.1.0 ❤️
🎉 2018.2.12 支持钉钉分享 🆕
🎉 2017.12.12 对代码进行简单重构并测试 稳定版本 1.0.0 ❤️
优势
🔥 开源:没有彩蛋,没有彩蛋,没有彩蛋;
🔥 简单:只需要关注登录、分享管理类和一个数据结构对象即可,不需要再关注平台之间的差异;
🔥 轻量:仅包含三方 SDK
和一个简单的异步框架(38k),网络请求、JSON
解析从外部注入,减少多余的依赖,保证与宿主项目高度统一;
🔥 面向需求设计:
- 良好的扩展性,容易增加新平台实现,例如华为联运登录接入等;
- 一致的外观,封装各平台内部实现,对外暴露统一的接口,若不支持,使用
web
分享兼容; - 无法支持的数据类型,使用
Intent
唤醒分享,如支持本地视频分享,qq
的纯文字分享等等; - 支持直接使用网络图片分享,内置自动下载和图片缓存功能;
- 图片 下载/加载 失败时降级使用资源图,避免分享被中断;
- 在分享前可统一重写数据对象,用来做分享的切面,支持图片加水印等类似需求;
- 支持短信、邮件、粘贴板等系统分享平台;
- 持久化存储
token
避免多次授权,可选择有效时长; - 针对选择留在三方应用的业务场景,可将其回调为成功或失败。
开始接入
STEP1: 添加插件依赖路径
project / build.gradle
1 | buildscript { |
STEP2: 配置参数,注意与 android
同级
app / build.gralde
1 | // 引用插件 |
STEP3:初始化
1 | SocialOptions options = new SocialOptions.Builder(this) |
说一下 Adapter
,项目内使用了 JSON
解析,网络请求等功能,但是又不想引入多余的框架,所以才用了宿主项目注入的方式,保证和宿主项目统一。
IJsonAdapter
,必须 !负责完成Json
解析和序列化,提供一个Gson
下的实现仅供参考 - GsonJsonAdapter.java;IRequestAdapter
,非必须!内部使用UrlConnection
做了一个默认的实现,负责完成网络请求,也可以使用OkHttp
重新实现,可以参考 - OkHttpRequestAdapter.java,目前微信的OAuth2
授权和图片下载的相关请求都是使用IRequestAdapter
代理;
登录功能
登陆功能支持三个平台,qq,微信,微博;
1 | // 3个平台 |
登录将会返回 LoginResult
, 其中主要包括登录类型,基本用户信息,令牌信息 3 部分;
1 | public class LoginResult { |
登录时需要设置登录回调:
1 | OnLoginListener listener = new OnLoginListener() { |
获取更多用户信息:
1 | SocialUser socialUser = loginResult.getSocialUser(); |
发起登录:
1 | LoginManager.login(mActivity, Target.LOGIN_QQ, listener); |
关于 token
时效,可以在初始化时设置 tokenExpiresHours
来控制,也同样提供清除授权 token
的方法。
1 | // 清除全部平台的 token |
分享功能
重要:请仔细查看平台和数据类型中间的支持能力
当 微博 使用 openApi
形式去分享时,可能有较长的延时,建议在生命周期中增加进度条显示,避免用户等待很久没有响应。
划分分享数据类型
针对业务逻辑和 SDK
设计,将分享数据类型划分为 7 种类型,他们能涵盖大多数业务场景,分别是:
1 | 开启 App 类型,打开渠道应用; |
为了保证每个平台都有封闭且统一的外观,如果某个平台不兼容某种类型的分享,将会使用 web
分享的方式代替;比如微信不支持 app
分享,分享出去之后时 web
分享的模式。
划分分享渠道
1 | // 支持的分享渠道 |
创建分享数据
分享时,我们首先要构造分享用的数据,ShareObj
对象提供了多种静态方法用来快速创建对应分享的类型的对象;
1 | // 测试用的路径 |
针对一些不能被统一的参数使用扩展的参数支持:
1 | // 使 ShareObj 支持短信分享 |
分享监听
使用 OnShareListener
作为监听分享回调;
1 | OnShareListener listener = new OnShareListener() { |
发起分享
1 | // 唤醒分享 |
重写分享对象
关于重写分享对象,其实提供一种能在分享之前对需要分享的 ShareObj
进行统一处理的机会,类似分享功能的一个切面,比如可以用来解决网络图片无法分享,我们需要将它下载到本地,在进行分享,又比如图片分享出去之前加上 app 水印等操作。
主要是重写 OnShareListener
的 onPrepareInBackground
方法,这个方法会在分享之前首先执行,如果返回不是 null
,将会使用新创建的 ShareObj
进行分享,另外由于考虑到可能进行耗时操作,这个方法是在子线程执行的。
1 |
|
错误码
为了更好的统一分享失败时返回的异常,返回的所有异常都会有一个 code
,可以根据不同的 code
定位问题和给出更友好的提示。
1 | int CODE_COMMON_ERROR = 101; // 通用错误,未归类 |
例如你可以这么做:
1 | listener = new OnShareListener() { |
扩展新的平台?
参考这里 HuaweiPlatform.java
向 SocialSdk
注册构建工厂:
1 | SocialSdk.addPlatform(new HuaweiPlatform.Factory()); |