100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 快速接入 微信微博QQ钉钉 原生登录分享

快速接入 微信微博QQ钉钉 原生登录分享

时间:2023-10-09 08:16:51

相关推荐

快速接入 微信微博QQ钉钉 原生登录分享

使用微博QQ微信钉钉原生SDK接入,提供这些平台的登录、分享功能支持。针对业务逻辑对各个平台的接口进行封装,对外提供一致的表现,在减轻接入压力的同时,又能获得原生SDK最大的灵活性。

考虑到每个平台的SDK也在不断的更新,且每个项目的需求差异比较大,如可能只需要支持部分平台,因此没有对类库进行发布,请下载GitHub上的module自行依赖,在类库设计的过程中,每个平台都是独立的,如果只需要支持部分平台,只需要删除platform包下面对应的实现即可,不会对其他平台造成影响。

项目地址 : GitHub - SocialSdkLibrary

本文地址 :快速接入微信微博QQ钉钉原生登录分享

? .12.12 对代码进行简单重构并测试,发布第一个稳定版本 1.0.0

? .2.12 支持钉钉分享

优点

还在优化中...

? 简单:只需要关注几个管理类和相关数据的构造即可实现所需功能,不需要考虑复杂的授权和分享逻辑。

? 轻量:除了必须的第三方sdk之外,本项目只依赖了一个简单的异步任务的框架bolts (38k),后续会考虑也剔除掉,不引入无用依赖,保证与宿主项目高度统一。

? 全面:内部存储授权token,避免多次授权;对 qq、微信、微博 做了完善的支持;

? 扩展性:

平台独立,项目以平台进行划分,各个平台之间完全独立,如果想仅支持部分平台,只需要删除platform包下该平台的具体实现即可。请求、JSON 解析等功能可从外部注入代理,对一些功能进行自定义的扩展。可以继承AbsPlatform接入其他平台分享,自定义扩展。

? 功能性:针对实际项目需求进行扩展,例如在分享前统一对分享数据提供一次重新构造的机会。

? 兼容性:

为多个平台提供外观一致的分享接口,若不支持,使用web分享兼容。支持直接使用网络图片分享,内置自动下载功能。使用Intent兼容不支持的数据模式,如支持本地视频分享,qq的纯文字分享等等。

主要类文件

使用SocialSdk只需要关注以下几个文件:

?️SocialSdk.java结合SocialConfig.java用来进行授权信息的配置。

?️Target.java类是单独分离出来的常量类,指向了登录和分享的具体目标。

?️LoginManager.java用来实现 qq、微信、微博第三方授权登录,内部存储accessToken,无需多次授权,只要调用LoginManager.login()方法。

?️️ShareManager.java用来实现8种数据类型、4个平台、8个渠道的分享,只要调用ShareManager.share()方法。

gradle 配置

针对多方SDK的要求,对权限、和必要的界面、服务都已经在类库中进行了配置,当依赖该类库时,会自动合并,不过仍然还需要在项目的app/build.gradle中配置对应的qqIdmanifestPlaceholders,代码如下:

defaultConfig {manifestPlaceholders = [qq_id: "11049xxxxx"]}复制代码

关于manifestPlaceholders的使用

当使用 manifestPlaceholders = [qq_id: "11049xxxxx"] 的方式时,之前声明的所有 manifestPlaceholders 都会被替换掉,只保留最后的。当使用 manifestPlaceholders.qq_id = "11049xxxxx" 的方式时,会在原来的 manifestPlaceholders 中追加新的,同时也保留以前的。建议的方式是,在 defaultConfig 中使用直接赋值的方式,而在 buildTypes 和 Favors 中使用追加的方式,避免将之前的覆盖掉。复制代码

初始化

你需要在使用 SDK 之前进行初始化操作,建议放在Applicaton中进行。

String qqAppId = getString(R.string.QQ_APPID);String wxAppId = getString(R.string.WEICHAT_APPID);String wxSecretKey = getString(R.string.WEICHAT_APPKEY);String sinaAppId = getString(R.string.SINA_APPKEY);String ddAppId = getString(R.string.DD_APPID);SocialSdkConfig config = new SocialSdkConfig(this).dd(ddAppId)// 配置qq.qq(qqAppId)// 配置wx.wechat(wxAppId, wxSecretKey)// 配置sina.sina(sinaAppId)// 配置Sina的RedirectUrl,有默认值,如果是官网默认的不需要设置.sinaRedirectUrl("/bbpp/app/weibo/common.php")// 配置Sina授权scope,有默认值,默认值 all.sinaScope(SocialConstants.SCOPE);// ? 添加 config 数据,必须SocialSdk.init(config);// ? 添加自定义的 json 解析,必须SocialSdk.setJsonAdapter(new GsonJsonAdapter());复制代码

adapter

使用adapter这种模式主要参照了一些成熟的类库,目的是为了对外提供更好的扩展性,这部分内容可以关注SocialSdk.java.

IJsonAdapter,负责Json解析,为了保持和宿主项目json解析框架的统一,是必须自定义添加的(没有内置一个实现是因为使用自带的JsonObject解析实在麻烦,又不想内置一个三方库进来,采取的这种折衷方案),提供一个Gson下的实现仅供参考 - GsonJsonAdapter.java

IRequestAdapter,负责请求数据,目前微信的OAuth2授权和图片下载的相关请求都是使用IRequestAdapter代理,已经使用URLConnection内置了一个实现,如果你有自己的需求可以重写这部分,注意https请求的兼容,可以参考 - RequestAdapterImpl.java

登录功能

登陆功能支持三个平台,qq,微信,微博;

// 3个平台Target.LOGIN_QQ;Target.LOGIN_WX;Target.LOGIN_WB;复制代码

使用OnLoginListener监听登录返回结果,返回的LoginResult中主要包括登录类型,基本用户信息,令牌信息 3 部分。

public class LoginResult {// 登陆的类型,对应 Target.LOGIN_QQ 等。。。private int type;// 返回的基本用户信息// 针对登录类型可强转为 WbUser,WxUser,QQUser 来获取更加丰富的信息private BaseUser mBaseUser;// 本次登陆的 token 信息,openid,unionid,token,expires_inprivate BaseAccessToken mBaseToken;}// 登陆结果监听mOnLoginListener = new OnLoginListener() {@Overridepublic void onLoginSucceed(LoginResult loginResult) {Log.e(TAG, loginResult.toString());}@Overridepublic void onCancel() {toast("登录取消");}@Overridepublic void onException(PlatformException e) {toast("登录失败 " + e.toString());}};// 3个平台Target.LOGIN_QQ;Target.LOGIN_WX;Target.LOGIN_WB;// 唤醒登陆LoginManager.login(mActivity, Target.LOGIN_QQ, mOnLoginListener);复制代码

清除授权token,为了避免每次登录都要求用户打开授权界面重新点击授权的不好体验,类库里面对token进行了持久化的存储,当本地token没有过期时,直接使用这个token去请求用户信息,同时提供了清除本地token的方法。

LoginManager.java// 清除全部平台的 tokenpublic static void clearAllToken(Context context)// 清除指定平台的 tokenpublic static void clearToken(Context context, @Target.LoginTarget int loginTarget)复制代码

分享功能

扩展支持

// 发短信ShareManager.sendSms(mActivity,"13612391817","msg body");// 发邮件ShareManager.sendEmail(mActivity,"1101873740@","subject","msg body");// 打开渠道对应应用ShareManager.openApp(mActivity,Target.SHARE_QQ_FRIENDS);复制代码

8 种数据支持

分享支持 8 种类型的数据;如果某个平台不兼容某种类型的分享,将会使用web分享的方式代替;比如微信不支持app分享,分享出去之后时web分享的模式。支持的 8 种类型分别是:

开启渠道对用的 app。分享文字。分享图片( jpg , png , gif )。分享 app。分享 web。分享 music。分享 video。分享本地 video,使用 Intent 方式唤醒。

8 个分享渠道

// 支持的分享渠道Target.SHARE_DD; // 钉钉好友Target.SHARE_QQ_FRIENDS; // qq好友Target.SHARE_QQ_ZONE; // qq空间Target.SHARE_WX_FRIENDS; // 微信好友Target.SHARE_WX_ZONE; // 微信朋友圈Target.SHARE_WX_FAVORITE; // 微信收藏Target.SHARE_WB_NORMAL; // 新浪微博Target.SHARE_WB_OPENAPI; // 新浪微博openApi分享,使用该方法分享图片时微博后面会带一个小尾巴,可以点击进入官微复制代码

创建分享数据

分享时,我们首先要构造分享用的数据,ShareObj对象提供了多种静态方法用来快速创建对应分享的类型的对象。

// 测试用的路径localImagePath = new File(Environment.getExternalStorageDirectory(), "1.jpg").getAbsolutePath();localVideoPath = new File(Environment.getExternalStorageDirectory(), "video.mp4").getAbsolutePath();localGifPath = new File(Environment.getExternalStorageDirectory(), "3.gif").getAbsolutePath();netVideoPath = "1.z0./export.mp4";netImagePath = "1.z0./token.png";netMusicPath = "1.z0./test_music.mp3";netMusicPath = "/sSocialSdkConfig/-05-19/1495207225.mp3";targetUrl = "/topics/391545021";// 打开渠道对应appShareObj shareMediaObj = ShareObj.buildOpenAppObj();// 分享文字ShareObj textObj = ShareObj.buildTextObj("分享文字", "summary");// 分享图片ShareObj imageObj = ShareObj.buildImageObj("分享图片", "summary", localImagePath);// 分享gifShareObj imageGifObj = ShareObj.buildImageObj("分享图片", "summary", localGifPath);// 分享appShareObj appObj = ShareObj.buildAppObj("分享app", "summary", localImagePath, targetUrl);// 分享webShareObj webObj = ShareObj.buildWebObj("分享web", "summary", localImagePath, targetUrl);// 分享视频ShareObj videoObj = ShareObj.buildVideoObj("分享视频", "summary", localImagePath, targetUrl, localVideoPath, 10);// 分享本地视频,使用 Intent 方式唤醒,支持 qq、微信 好友分享ShareObj videoLocalObj = ShareObj.buildVideoObjByLocalPath(localVideoPath);// 分享音乐ShareObj musicObj = ShareObj.buildMusicObj("分享音乐", "summary", localImagePath, targetUrl, netMusicPath, 10);复制代码

分享监听

分享结果,使用OnShareListener进行检测。OnShareListener提供了丰富的方法来支持分享的各个阶段,关于分享对象重构的操作,在下一部分说明。

public class SimpleShareListener implements OnShareListener{@Overridepublic void onStart(int shareTarget, ShareObj obj) {// 分享开始}@Overridepublic ShareObj onPrepareInBackground(int shareTarget, ShareObj obj) {// 重构分享对象,不需要时返回 null 即可return null;}@Overridepublic void onSuccess() {// 分享成功}@Overridepublic void onFailure(SocialException e) {// 分享失败}@Overridepublic void onCancel() {// 分享取消}}复制代码

发起分享

// 唤醒分享ShareManager.share(mActivity, Target.SHARE_QQ_FRIENDS, imageObj, mOnShareListener);复制代码

重写分享对象

关于重写分享对象,其实提供一种能在分享之前对需要分享的ShareObj进行统一处理的机会,类似中间插一道自定义工序,比如可以用来解决网络图片无法分享,我们需要将它下载到本地,在进行分享,又比如图片分享出去之前加上 app 水印等操作。

主要是重写OnShareListeneronPrepareInBackground方法,这个方法会在分享之前首先执行,如果返回不是 null,将会使用新创建的ShareObj进行分享,另外由于考虑到可能进行耗时操作,这个方法是在子线程执行的。

@Overridepublic ShareObj onPrepareInBackground(int shareTarget,ShareObj obj) {// 重构分享对象,不需要时返回 null 即可return null;}复制代码

看一个基本的实例,主要功能是在分享之前用来将网络图下载到本地然后更新ShareObj指向的图片地址,这样就可以支持网络图片的直接分享,当然,这个功能已经内置在类库中。

public class MyShareListener extends SimpleShareListener {public static final String TAG = MyShareListener.class.getSimpleName();private Context mContext;private LoadingDialog mLoadingDialog;public MyShareListener(Context context) {mContext = context;mLoadingDialog = new LoadingDialog(mContext);}@Overridepublic void onStart(int shareTarget, ShareObj obj) {if (mLoadingDialog != null)mLoadingDialog.show();}@Overridepublic ShareObj onPrepareInBackground(int shareTarget, ShareObj obj) throws Exception{// 网络路径,先进行文件下载进行文件下载ShareObjHelper.prepareThumbImagePath(obj);// 分享照片且不是gif时加水印if (obj.getShareObjType() == ShareObj.SHARE_TYPE_IMAGE&& !FileHelper.isGifFile(obj.getThumbImagePath())) {File thumbImageFile = new File(obj.getThumbImagePath());File saveFile = new File(Constants.THUMB_IMAGE_PATH, thumbImageFile.getName());if (!FileUtil.fileIsExist(saveFile.getAbsolutePath())) {ImageUtils.drawWaterMarkSync(mContext, obj.getThumbImagePath(), saveFile.getAbsolutePath(), false, false);}obj.setThumbImagePath(saveFile.getAbsolutePath());}return obj;}@Overridepublic void onSuccess() {ToastUtil.show("分享成功");}@Overridepublic void onFailure(SocialException e) {switch (e.getErrorCode()) {case SocialException.CODE_NOT_INSTALL:ToastUtil.show("应用未安装");break;}L.e(TAG, "分享失败" + e.toString());}@Overridepublic void onCancel() {ToastUtil.show("分享取消");}}复制代码

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。