本系列文章将第三方的登录分享功能进行二次封装,统一接口调用,简化了接不同平台登录分享的步骤。

0 系列文章

系列一 Android SDK的二次封装和使用

系列二 源码解析

系列三 微信SDK接入

系列四 QQ SDK接入

系列五 新浪微博 SDK接入

1 前言

现在有市场上又好几家都做了社会化分享组件,比如ShareSDK,Umeng等。唯一的缺点就是,必须得注册相应服务平台的账号。无法单纯使用客户端SDK。

本系列文章即开源实现了社会化的登录分享,统一对外接口。会分别从如何使用、源码解析、各平台接入进行解读。

2 Github地址

先上开源代码和封装好的SDK。

https://github.com/tsy12321/SocialSDKAndroid

欢迎在issue里提功能需求和建议!

3 目录介绍

如图:

目录结构

采用了jar包的方式封装sdk,需要使用时可以引入social_sdk.jar再搭配需要的平台sdk使用.

这种方式可以减少sdk的体积,需要什么平台就引入哪个平台.更为合理.

目录结构:

  • app/ Demo代码
  • social_sdk/ sdk的开发源码module 开发完成后用gradle中makejar打成jar包
  • social_sdk_vxxx.jar sdk的jar包 直接使用.搭配所需的平台sdk包.
  • weixin_sdk/ 微信sdk
  • qq_sdk/ qq sdk
  • sina_weibo_sdk/ 新浪微博 sdk

4 Demo介绍

替换Demo中的MainActivity中的qq appid、wx appid、weibo appkey为自己的

public class MainActivity extends AppCompatActivity implements IWeiboHandler.Response{
...

<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String WX_APPID = <span class="hljs-string">"your wx appid"</span>;    <span class="hljs-comment">//申请的wx appid</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String QQ_APPID = <span class="hljs-string">"your qq appid"</span>; <span class="hljs-comment">//申请的qq appid</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String SINA_WB_APPKEY = <span class="hljs-string">"your sina wb appkey"</span>; <span class="hljs-comment">//申请的新浪微博 appkey</span> ...

}

替换AndroidManifest中的qq appid为自己的

<!--qq-->
<activity
android:name="com.tencent.tauth.AuthActivity"
android:noHistory="true"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tencent1111111" /> <!--1111111改为你的qq appid-->
</intent-filter>
</activity>

替换builde.gradle文件中的签名为自己的app签名。

修改完上面3个地方后即可跑通Demo。如下

Demo

5 功能介绍

该SDK主要集成了授权登录和分享的功能

5.1 授权登录

  1. 微信授权登录
  2. QQ授权登录
  3. 新浪微博授权登录

5.2 分享

5.2.1 分享媒介

  1. 文字
  2. 图片
  3. 音乐
  4. 视频
  5. 网页

5.2.2 分享平台

  1. 微信会话分享
  2. 微信朋友圈分享
  3. QQ分享
  4. QQ空间分享
  5. 新浪微博分享

6 开发说明

6.1 准备

将social_sdk.jar和需要的平台sdk放入项目中引用.

AndroidManifest加上以下基本的权限(之后各个平台会注册一些不同的信息后面会说明)

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

6.2 配置平台信息

在项目入口(或者在调用前)需要配置平台的信息,配置一次即可.

PlatformConfig.setWeixin(WX_APPID);
PlatformConfig.setQQ(QQ_APPID);
PlatformConfig.setSinaWB(SINA_WB_APPKEY);

6.3 接口使用说明

调用方式使用api调用登录或者分享接口,在参数中区别平台,实现回调接收成功 取消或者失败的结果.

示例如下:(某些平台会有一些特殊处理后面会在平台中说明)

初始化api:

SocialApi mSocialApi = SocialApi.get(getApplicationContext());

登录授权:

mSocialApi.doOauthVerify(this, PlatformType.WEIXIN, new AuthListener() {
@Override
public void onComplete(PlatformType platform_type, Map<String, String> map) {
Log.i("tsy", "oncomplete:" + map);
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span><span class="hljs-params">(PlatformType platform_type, String err_msg)</span> </span>{
Log.i(<span class="hljs-string">"tsy"</span>, <span class="hljs-string">"onError:"</span> + err_msg);
} <span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCancel</span><span class="hljs-params">(PlatformType platform_type)</span> </span>{
Log.i(<span class="hljs-string">"tsy"</span>, <span class="hljs-string">"onCancel"</span>);
}

});

分享:


//分享媒介 后面有详细介绍
ShareWebMedia shareMedia = new ShareWebMedia();
shareMedia.setTitle("分享网页测试");
shareMedia.setDescription("分享网页测试");
shareMedia.setWebPageUrl("http://www.baidu.com");
shareMedia.setThumb(BitmapUtils.readBitMap(getApplicationContext(), R.mipmap.ic_launcher)); mSocialApi.doShare(this, PlatformType.WEIXIN, shareMedia, new ShareListener() {

@Override

public void onComplete(PlatformType platform_type) {

Log.i("tsy", "share onComplete");

}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span><span class="hljs-params">(PlatformType platform_type, String err_msg)</span> </span>{
Log.i(<span class="hljs-string">"tsy"</span>, <span class="hljs-string">"share onError:"</span> + err_msg);
} <span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCancel</span><span class="hljs-params">(PlatformType platform_type)</span> </span>{
Log.i(<span class="hljs-string">"tsy"</span>, <span class="hljs-string">"share onCancel"</span>);
}

});

6.4 分享媒介

现在集成了文字分享,图片分享,音乐分享,视频分享,网页分享5种分享媒介.不同的平台可能只有其中某几种.

6.4.1 文字分享

ShareTextMedia shareMedia = new ShareTextMedia();
shareMedia.setText("分享文字测试");

6.4.2 图片分享

ShareImageMedia shareMedia = new ShareImageMedia();
shareMedia.setImage(BitmapUtils.readBitMap(getApplicationContext(), R.mipmap.ic_launcher));

6.4.3 音乐分享

ShareMusicMedia shareMedia = new ShareMusicMedia();
shareMedia.setTitle("分享音乐测试");
shareMedia.setDescription("分享音乐测试");
shareMedia.setMusicUrl("http://idg-tangsiyuan.tunnel.nibaguai.com/splash/music.mp3");
shareMedia.setThumb(BitmapUtils.readBitMap(getApplicationContext(), R.mipmap.ic_launcher));

6.4.4 视频分享

ShareVideoMedia shareMedia = new ShareVideoMedia();
shareMedia.setTitle("分享视频测试");
shareMedia.setDescription("分享视频测试");
shareMedia.setVideoUrl("http://idg-tangsiyuan.tunnel.nibaguai.com/splash/music.mp3");
shareMedia.setThumb(BitmapUtils.readBitMap(getApplicationContext(), R.mipmap.ic_launcher));

6.4.5 网页分享

ShareWebMedia shareMedia = new ShareWebMedia();
shareMedia.setTitle("分享网页测试");
shareMedia.setDescription("分享网页测试");
shareMedia.setWebPageUrl("http://www.baidu.com");
shareMedia.setThumb(BitmapUtils.readBitMap(getApplicationContext(), R.mipmap.ic_launcher));

7 第三方平台接入

7.1 微信

7.1.1 集成sdk

将目录中的weixin_sdk_v3.1.1.jar放入项目.

7.1.2 配置

AndroidManifest中添加:

<activity
android:name="com.tsy.sdk.social.weixin.WXCallbackActivity"
android:configChanges="orientation|keyboardHidden|navigation|screenSize"
android:exported="true"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity-alias
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:targetActivity="com.tsy.sdk.social.weixin.WXCallbackActivity" />

7.1.3 常量定义

设置配置信息:

PlatformConfig.setWeixin(WX_APPID);

PlatformType:

微信:PlatformType.WEIXIN(可用于登录和微信回话分享)

朋友圈:PlatformType.WEIXIN_CIRCLE(用于微信朋友圈分享)

7.1.4 注意

使用微信登录分享需要签名打包,并且签名和包名要和微信平台填入的信息一致。

7.2 QQ

7.2.1 集成sdk

将目录中的qq_mta-sdk-1.6.2.jar和qq_sdk_v3.1.0.jar放入项目.

7.2.2 配置

AndroidManifest中添加:

<!--qq-->
<activity
android:name="com.tencent.tauth.AuthActivity"
android:noHistory="true"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tencent你的appid" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />

7.2.3 常量定义

设置配置信息:

PlatformConfig.setQQ(QQ_APPID);

PlatformType:

微信:PlatformType.QQ(可用于登录和QQ分享)

朋友圈:PlatformType.QZONE(用于qq控件分享)

7.2.4 注意

使用QQ登录需要签名打包,并且签名和包名要和QQ开放平台填入的信息一致。

7.3 新浪微博

7.3.1 集成sdk

将目录中的weiboSDKCore_3.1.4.jar放入项目.

将所有so文件统一放到项目的目录app/jniLibs中(和libs同级), 然后在gradle中加上

android {
...

<span class="hljs-comment">//引入微博的所有so库</span>
sourceSets {
main {
jniLibs.srcDirs = [<span class="hljs-string">'jniLibs'</span>]
}
}

}

7.3.2 配置

AndroidManifest中添加:

<activity
android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"
android:configChanges="keyboardHidden|orientation"
android:exported="false"
android:windowSoftInputMode="adjustResize"></activity>

并且在发起分享的activity页面的AndroidManifest页面中加上

<activity android:name="com.tsy.girl.MainActivity">     <!--发起分享的页面-->
<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中添加以下代码.(假如是MainActivity)

实现IWeiboHandler.Response接口, 然后在实现的方法中写:

@Override
public void onResponse(BaseResponse baseResponse) {
((SinaWBHandler)mSocialApi.getSSOHandler(PlatformType.SINA_WB)).onResponse(baseResponse);
}

实现onNewIntent和onActivityResult方法:

@Override
protected void onNewIntent(Intent intent) {
((SinaWBHandler)mSocialApi.getSSOHandler(PlatformType.SINA_WB)).onNewIntent(intent, this);
} @Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

mSocialApi.onActivityResult(requestCode, resultCode, data);

}

在onCreate中添加以下:

if (savedInstanceState != null) {
((SinaWBHandler)mSocialApi.getSSOHandler(PlatformType.SINA_WB)).onNewIntent(getIntent(), this);
}

然后正常发起授权或者分享代码即可.

7.3.3 常量定义

设置配置信息:

PlatformConfig.setSinaWB(SINA_WB_APPKEY);

7.3.4 注意

使用新浪登录分享需要签名打包,并且签名和包名要和新浪平台填入的信息一致。

结尾

整个项目是一个可扩展的SDK,欢迎fork实现自己需要增加平台的代码,这个库本身也会不断添加平台和功能点。本篇就酱紫了,下篇会有整个SDK的基本源码解析。

      </div>

社会化登录分享-Android SDK的二次封装和使用的更多相关文章

  1. Android应用之——微信微博第三方sdk登录分享使用过程中的一些常见问题

    前言 近期在使用第三方登录和分享的过程中遇到了非常多问题,一方面能够归结为自己经验的不足,还有一方面事实上也说明了官方文档的含糊不清.这篇博文不会写关于怎样使用第三方登录分享,由于官方文档已经写明了步 ...

  2. Android 应用程序集成Google 登录及二次封装

    谷歌登录API:  https://developers.google.com/identity/sign-in/android/ 1.注册并且登录google网站 https://accounts. ...

  3. Android 应用程序集成FaceBook 登录及二次封装

    1.首先在Facebook 开发者平台注册一个账号 https://developers.facebook.com/ 开发者后台  https://developers.facebook.com/ap ...

  4. Android进阶笔记06:Android 实现扫描二维码实现网页登录

    一. 扫描二维码登录的实现机制: 详细流程图: (1)PC端打开网页(显示出二维码),这时候会保存对应的randnumber(比如:12345678). (2)Android客户端扫码登录,Andro ...

  5. Android SDK 百度云盘分享链接

    SDK百度云盘地址: 链接: http://pan.baidu.com/s/1skSCplF 密码: drq4 使用说明: 这是Android开发所需的sdk,下载并解压后,将解压出的整个文件夹复制或 ...

  6. Android摸索-二、解决Android SDK Manager下载太慢问题

    下载Android SDK Manger 那个速度…………   有了这个再也不用担心了 1.打开android sdk manager 2.打开tool->options 按图片中输入参数:mi ...

  7. Appium移动自动化测试-----(二)安装 Android SDK

    安装Android SDK Android SDK(Software Development Kit,软件开发工具包)提供了 Android API 库和开发工具构建,测试和调试应用程序.简单来讲,A ...

  8. React Native微信分享 朋友圈分享 Android/iOS 通用

    超详细React Native实现微信好友/朋友圈分享功能-Android/iOS双平台通用   2016/06/16 |  React Native技术文章 |  Sky丶清|  暂无评论 |  1 ...

  9. [转] Android SDK manager 无法获取更新版本列表

      打开这个网址(LINK)就可以看到adt的详细信息. 或者直接在你的eclipse的Help > Install New Software里面add,地址直接输入 https://dl-ss ...

随机推荐

  1. Django的命令

    安装django          : pip install django 创建django项目   :django-admin startproject projectname 启动django项 ...

  2. request.getRemoteUser() Spring Security做权限控制后

    一. request.getRemoteUser();//获取当前缓存的用户,比如Spring Security做权限控制后就会将用户登录名缓存到这里 request.getRemoteAddr(); ...

  3. 为什么要学习Numerical Analysis

    前几日我发了一个帖子,预告自己要研究一下  Numerical Analysis 非常多人问我为啥,我统一回答为AI-----人工智能 我在和教授聊天的时候,忽然到了语言发展上 我说:老S啊(和我关系 ...

  4. python opencv —— io(帧、图像、视频的读取与保存)

    0. VideoCapture VideoCapture:构造函数: 常见成员函数: open:打开视频文件,或者捕获视频设备,该函数会首先调用 release() 函数以关闭已打开的文件或设备: P ...

  5. Docker---(1)Docker 简介

    原文:Docker---(1)Docker 简介 版权声明:欢迎转载,请标明出处,如有问题,欢迎指正!谢谢!微信:w1186355422 https://blog.csdn.net/weixin_39 ...

  6. Oracle10g中阻塞锁查询更简单

    http://blog.itpub.net/195110/viewspace-677572/ http://blog.sina.com.cn/s/blog_636415010100khcl.html

  7. VMware Ubuntu安装具体过程

    不是每个程序猿都必须玩过linux,仅仅是博主认为如今的非常多server都是linux系统的,而自己属于那种前端也搞.后台也搞,对框架搭建也感兴趣,可是非常多生产上的框架和工具都是安装在server ...

  8. Linux中IRC通讯工具Pidgin的基本用法

    这是我发在南昌大学开源小组里的一篇教程 IRC IRC是个古老的产物,在图形界面流行之前就出现了.可是在现在非常多开源社区都是利用IRC来进行团队交流或对用户提供技术支持的,比方维基百科,所以还是有必 ...

  9. TTS-零基础入门之语音模板化

    上篇介绍了TTS的一个简单样例http://blog.csdn.net/u010176014/article/details/47326413 本篇咱们进一步聊聊 语音怎样读模板. 比方 公交车上的模 ...

  10. (转)c++ 中的using namespace std是什么意思,什么时候用

    使用std命名空间 98年以后的c++语言提供一个全局的命名空间namespace,可以避免导致全局命名冲突问题.举一个实例,请注意以下两个头文件: // one.hchar func(char);c ...