최신 버전(1.2.0) 더 쉽고, 더 가볍고, 더 비즈니스 지향적입니다.
더 간단하고, 더 가벼우며, 비즈니스 요구에 더 중점을 두는 것을 목표로 Weibo , WeChat , QQ , Tim , QQ 채팅 버전 및 DingTalk 에 대한 로그인 및 공유 기능 지원을 제공합니다.
프로젝트 주소: GitHub - SocialSdkLibrary
블로그 주소: WeChat, Weibo, QQ 및 DingTalk 기본 로그인 및 공유에 빠르게 액세스
? WeChatQQWeibo SDK 버전은 업그레이드될 수 있습니다. 다음 버전이 업그레이드되면 Weibo는 큰 변화를 겪게 됩니다.
? 362 on 2020.1.21? La, 버전 1.2.0
출시, 플러그인 업데이트, 최신 버전의 Gradle
지원, Gradle + APT + ASM
사용하여 Platform
클래스 자동 검색, 초기화 코드 자동 등록 및 내장 json
구문 분석 및 http
요청, 초기화 구성이 더 간단합니다.
2019.6.13 WeChat 스캔 코드 로그인 지원
2019년 5월 28일, 프로젝트는 329번째?를 수신하고 라이프 사이클을 자동으로 관리하며 콜백 매개변수를 통합하고 안정적인 버전 1.0.1 ❤️을 출시했습니다.
? 2019.3.28 gradle plugin
사용하여 종속성 자동 관리, 버전 번호 재설계, 안정 버전 0.1.1 ❤️
? 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 DingTalk 공유를 지원하나요?
? 2017.12.12 간단한 코드 리팩토링 및 안정 버전 1.0.0 테스트 ❤️
오픈 소스: 부활절 달걀 없음, 부활절 달걀 없음, 부활절 달걀 없음;
간단합니다. 로그인, 공유 관리 클래스 및 데이터 구조 개체에만 주의하면 되며 플랫폼 간의 차이점에는 주의할 필요가 없습니다.
경량: 타사 SDK
와 간단한 비동기 프레임워크(38k)만 포함되어 있으며 네트워크 요청 및 JSON
구문 분석이 외부에서 주입되어 중복 종속성을 줄이고 호스트 프로젝트와의 높은 수준의 통일성을 보장합니다.
종합: 미니 프로그램 공유, 링크 복사, 로그인을 위한 QR 코드 스캔, 복합 운송 홍보 등
요구 사항에 따른 설계:
code
얻을 수 있고 서버는 token
얻을 수 있습니까?wxOnlyAuthCode
매개변수를 구성합니다.web
공유를 사용하십시오.qq
일반 텍스트 공유 등과 같은 공유를 깨우기 위해 Intent
사용하십시오.token
지속적으로 저장할 수 있습니다. 다음에 토큰이 인증되면 데이터를 직접 얻을 수 있습니다. 그러나 사용자가 WeChat 계정을 변경하면 이 기간은 전환할 수 없습니다. 시간을 신중하게 고려해야 합니다.SocialSdk
사용해 보세요. STEP1 : 플러그인 종속성 경로 추가
프로젝트/build.gradle
buildscript {
repositories {
maven { url "https://dl.bintray.com/zfy/maven" }
}
dependencies {
// 请查看文初最新版本,这边可能忘记更新!!!
classpath 'com.zfy.social:social-sdk-plugin:1.2.0'
}
}
allprojects {
repositories {
maven { url "https://dl.bintray.com/zfy/maven" }
}
}
STEP2 : 구성 매개변수
앱/build.gralde
보안상의 이유로 원격 끝에 제출하지 않도록 local.properties
에서 구성하는 것이 좋습니다.
// 在顶部引用插件
apply plugin: 'socialsdk'
// android 配置模块
android {
...
}
// socialsdk 配置模块
socialsdk {
wx {
appId = '111xxx2222'
appSecret = '111xxx2222'
// 微信授权是否只返回 code, 用于服务端授权的场景
onlyAuthCode = false
}
qq {
appId = '111xxx2222'
appSecret = '111xxx2222'
}
wb {
appId = '111xxx2222'
url = '111xxx2222'
}
dd {
appId = '111xxx2222'
}
}
위의 구성은 가장 간단한 구성입니다. 자세한 구성 매개변수는 기본 구성을 참조하세요.
socialsdk {
// 调试模式,默认 false, 可以在代码中开启
debug = true
// 分享:选择停留在微信时自动返回成功,默认返回失败
shareSuccessIfStay = true
// 登录:token 过期时间,单位小时,默认立即过期,有效期内可以不需要再次唤醒第三方 app,但是二次登录也没办法切换账号,这会引发问题,所以默认立即过期
tokenExpiresHours = 100
// 使用 gson 作为数据解析,默认 true,你如果不用 gson 就需要自己编写 JSONAdapter
useGson = true
// 使用 okHttp 发送请求,默认 true,你如果不用 okhttp 就需要自己编写 RequestAdapter
useOkHttp = true
// 配置 app 名称,默认使用 R.string.app_name
appName = "哈哈哈"
// 唤醒过程中的 loading 颜色
color = "#FF0000"
wx { }
qq { }
wb { }
dd { }
}
STEP3 : 초기화
SocialOptions options = new SocialOptions . Builder ( this )
// 调试模式,开启 log 输出
. debug ( true )
// 加载缩略图失败时,降级使用资源图
. failImgRes ( R . drawable . share_default_img )
// 添加分享拦截器,重新处理分享的数据
. addShareInterceptor (( context , obj ) -> {
obj . setSummary ( "被重新组装" + obj . getSummary ());
return obj ;
})
// 构建
. build ();
// 初始化
SocialSdk . init ( options );
로그인 기능은 QQ, WeChat, Weibo의 세 가지 플랫폼을 지원합니다.
// 3个平台
Target . LOGIN_QQ ; // QQ 登录
Target . LOGIN_WX ; // 微信 登录
Target . LOGIN_WX_SCAN ; // 微信扫码 登录
Target . LOGIN_WB ; // 微博 登录
로그인은 LoginResult
반환합니다. 여기에는 주로 로그인 유형, 기본 사용자 정보, 토큰 정보의 세 부분이 포함됩니다.
LoginResult {
// 状态,成功,失败,取消等
public int state ;
// 目标平台
public int target ;
// 发生错误时使用
public SocialError error ;
// 针对登录类型可强转为 WbUser,WxUser,QQUser 来获取更加丰富的信息
public SocialUser socialUser ;
// 本次登陆的 token 信息,openId, unionId,token,expires_in
public AccessToken accessToken ;
// 授权码,如果 onlyAuthCode 为 true, 将会返回它
public String wxAuthCode ;
// 扫码登录二维码文件路径
public String wxCodePath ;
}
로그인할 때 로그인 콜백을 설정해야 합니다.
new OnLoginStateListener () {
@ Override
public void onState ( Activity act , LoginResult result ) {
switch ( result . state ) {
case LoginResult . STATE_START :
// 登录开始
break ;
case LoginResult . STATE_COMPLETE :
// 登录完成
break ;
case LoginResult . STATE_ACTIVE :
// 透明 Activity 开启
break ;
case LoginResult . STATE_SUCCESS :
// 登录成功
break ;
case LoginResult . STATE_FAIL :
// 登录失败
result . error
break ;
case LoginResult . STATE_CANCEL :
// 登录取消
break ;
case LoginResult . STATE_WX_CODE_RECEIVE :
// 获取到微信登录二维码
break ;
case LoginResult . STATE_WX_CODE_SCANNED :
// 微信登录二维码被扫描
break ;
}
}
};
더 많은 사용자 정보 얻기:
SocialUser socialUser = loginResult . socialUser ;
// 基本信息可以从 SocialUser 在获取到
String userNickName = socialUser . getUserNickName ();
// 获取 openId
String openId = socialUser . getOpenId ();
// 微信获取 unionId,其他平台仍旧返回 openId
String unionId = socialUser . getUnionId ();
// 获取 userId,微信返回 unionId, 其他平台返回 openId
String userId = socialUser . getUserId ();
// 强转为平台用户,可以拿到更多信息
int target = result . getTarget ();
switch ( target ) {
case Target . LOGIN_QQ :
QQUser qqUser = ( QQUser ) socialUser ;
break ;
case Target . LOGIN_WB :
WbUser wbUser = ( WbUser ) socialUser ;
break ;
case Target . LOGIN_WX :
WxUser wxUser = ( WxUser ) socialUser ;
break ;
}
로그인 시작:
LoginManager . login ( mActivity , Target . LOGIN_QQ , listener );
로그인하려면 WeChat QR 코드를 스캔하는 등의 매개변수를 사용하여 로그인하세요.
LoginObj obj = new LoginObj ();
// 根据文档要求,以下数据应在服务端缓存获取
// 如果不设置,将会使用配置时设置的 secret
obj . setAppSecret ( "0a3cb00******ee3654f499171" );
obj . setNonceStr ( "3611cdc33b******a49ca45bdfab2d" );
obj . setTimestamp ( "15604******6904" );
obj . setSignature ( "b28f69426******18c8ba792caa4a0a1bcc" );
// 如果不设置,将会使用 SocialValues.WX_SCOPE
obj . setScope ( SocialValues . WX_SCOPE );
LoginManager . login ( mActivity , Target . LOGIN_WX_SCAN , obj , listener );
token
에이징과 관련하여 초기화 중에 tokenExpiresHours
설정하여 이를 제어할 수 있습니다. 또한 인증 token
지우는 방법도 제공합니다.
// 清除全部平台的 token
LoginManager . clearAllToken ( context );
// 清除指定平台的 token
LoginManager . clearToken ( context , Target . LOGIN_QQ );
중요: 플랫폼과 데이터 유형 간의 지원 기능을 주의 깊게 검토하십시오.
Weibo가 openApi
사용하여 공유할 때 오랜 지연이 발생할 수 있습니다. 사용자가 응답하지 않고 오랫동안 기다리는 것을 방지하기 위해 수명 주기에 진행률 표시줄을 추가하는 것이 좋습니다.
비즈니스 로직 및 SDK
설계의 경우 공유 데이터 유형은 대부분의 비즈니스 시나리오를 포괄할 수 있는 7가지 유형으로 구분됩니다.
开启 App 类型,打开渠道应用;
文字类型,纯文本分享;
图片类型(jpg, png, gif(要求能动));
App 推广类型;
网页链接类型;
音频分享类型;
视频分享类型;
각 플랫폼이 폐쇄적이고 통일된 모습을 갖도록 하기 위해 플랫폼이 특정 유형의 공유와 호환되지 않는 경우 web
공유가 대신 사용됩니다. 예를 들어 WeChat은 app
공유를 지원하지 않으며 web
공유 모드는 다음과 같습니다. 공유 후 사용하세요.
// 支持的分享渠道
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 ; // 新浪微博
Target . SHARE_SMS ; // 短信分享
Target . SHARE_EMAIL ; // 邮件分享
Target . SHARE_CLIPBOARD ; // 粘贴板分享
공유할 때 먼저 공유할 데이터를 구성해야 합니다. 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 = "http://7xtjec.com1.z0.glb.clouddn.com/export.mp4" ;
netImagePath = "http://7xtjec.com1.z0.glb.clouddn.com/token.png" ;
netMusicPath = "http://7xtjec.com1.z0.glb.clouddn.com/test_music.mp3" ;
netMusicPath = "http://mp3.haoduoge.com/test/2017-05-19/1495207225.mp3" ;
targetUrl = "http://bbs.csdn.net/topics/391545021" ;
// 打开渠道对应app
ShareObj shareMediaObj = ShareObj . buildOpenAppObj ();
// 分享文字
ShareObj textObj = ShareObj . buildTextObj ( "分享文字" , "summary" );
// 分享图片
ShareObj imageObj = ShareObj . buildImageObj ( "分享图片" , "summary" , localImagePath );
// 分享gif
ShareObj imageGifObj = ShareObj . buildImageObj ( "分享图片" , "summary" , localGifPath );
// 分享app
ShareObj appObj = ShareObj . buildAppObj ( "分享app" , "summary" , localImagePath , targetUrl );
// 分享web
ShareObj webObj = ShareObj . buildWebObj ( "分享web" , "summary" , localImagePath , targetUrl );
// 分享视频
ShareObj videoObj = ShareObj . buildVideoObj ( "分享视频" , "summary" , localImagePath , targetUrl , localVideoPath , 10 );
// 本地视频分享、部分平台支持
ShareObj videoLocalObj = ShareObj . buildVideoObj ( "分享本地视频" , "summary" , localImagePath , targetUrl , localVideoPath , 0 );
// 分享音乐
ShareObj musicObj = ShareObj . buildMusicObj ( "分享音乐" , "summary" , localImagePath , targetUrl , netMusicPath , 10 );
통합할 수 없는 일부 매개변수에 대해 확장된 매개변수 지원을 사용하십시오.
// 使 ShareObj 支持短信分享
webObj . setSmsParams ( "13611301719" , "说啥呢" );
// 使 ShareObj 支持粘贴板分享
webObj . setClipboardParams ( "复制的内容" );
// 使 ShareObj 支持邮件分享
webObj . setEMailParams ( "[email protected]" , "主题" , "内容" );
// 使 ShareObj 在微信平台优先使用小程序分享
webObj . setWxMiniParams ( "51299u9**q31" , SocialValues . WX_MINI_TYPE_RELEASE , "/page/path" );
OnShareStateListener
청취 공유 콜백으로 사용하세요.
new OnShareStateListener () {
@ Override
public void onState ( Activity act , ShareResult result ) {
switch ( result . state ) {
case LoginResult . STATE_START :
// 分享开始
break ;
case LoginResult . STATE_COMPLETE :
// 分享完成
break ;
case LoginResult . STATE_ACTIVE :
// 透明 Activity 开启
break ;
case ShareResult . STATE_SUCCESS :
// 分享成功
break ;
case ShareResult . STATE_FAIL :
SocialError e = result . error ;
// 分享失败
break ;
case ShareResult . STATE_CANCEL :
// 分享取消
break ;
}
}
};
// 唤醒分享
ShareManager . share ( mActivity , Target . SHARE_QQ_FRIENDS , imageObj , mOnShareListener );
공유 객체 재작성은 실제로 공유하기 전에 공유해야 할 ShareObj
균일하게 처리할 수 있는 기회를 제공하는데, 이는 다음 시나리오와 같은 공유 기능의 측면과 유사합니다.
app
워터마크를 사진에 추가해야 합니다.url
shareId
등과 같은 공개 매개변수를 전달하며 액세스 통계는 H5
에서 수행됩니다. 공유 객체를 다시 작성하기 위해 인터셉터를 사용합니다. SDK
초기화될 때 인터셉터가 삽입됩니다. 여러 인터셉터가 지원되며 다양한 비즈니스를 서로 다른 인터셉터로 나눌 수 있습니다.
UI
변경해야 하는 경우 이를 메인 스레드에서 실행해야 합니다.
SocialOptions options = new SocialOptions . Builder ( this )
// ... 其他初始化代码
// 添加分享拦截器
. addShareInterceptor (( context , target , obj ) -> {
obj . setSummary ( "描述加前缀" + obj . getSummary ());
return obj ;
})
. addShareInterceptor (( context , target , obj ) -> {
obj . setTargetUrl ( obj . getTargetUrl ()+ "?id=100" );
return obj ;
})
// 构建
. build ();
// 初始化
SocialSdk . init ( options );
일반적으로 공유할 때 페이스트보드에 복사/SMS 공유 지원/이메일 공유 지원 등과 같은 요구 사항이 발생합니다. SocialSdk
에는 이러한 기능이 내장되어 있으며 이를 구현하려면 ShareObj
만든 후 추가 매개 변수를 추가해야 합니다.
shareObj . setSmsParams ( "13611301719" , "说啥呢" );
shareObj . setEMailParams ( "[email protected]" , "主题" , "内容" );
shareObj . setClipboardParams ( "复制的内容" );
추가 매개변수 형식을 사용하여 WeChat 애플릿 공유를 지원합니다.
shareObj . setWxMiniParams ( "51299u9**q31" , SocialValues . WX_MINI_TYPE_RELEASE , "/page/path" );
실패가 발생할 때 반환된 예외를 더 잘 통합하고 공유하기 위해 반환된 모든 예외에는 문제를 찾고 다양한 code
기반으로 보다 친숙한 프롬프트를 제공할 수 있는 code
가 있습니다.
int CODE_COMMON_ERROR = 101 ; // 通用错误,未归类
int CODE_NOT_INSTALL = 102 ; // 没有安装应用
int CODE_VERSION_LOW = 103 ; // 版本过低,不支持
int CODE_SHARE_BY_INTENT_FAIL = 105 ; // 使用 Intent 分享失败
int CODE_STORAGE_READ_ERROR = 106 ; // 没有读存储的权限,获取分享缩略图将会失败
int CODE_STORAGE_WRITE_ERROR = 107 ; // 没有写存储的权限,微博分享视频copy操作将会失败
int CODE_FILE_NOT_FOUND = 108 ; // 文件不存在
int CODE_SDK_ERROR = 109 ; // sdk 返回错误
int CODE_REQUEST_ERROR = 110 ; // 网络请求发生错误
int CODE_CANNOT_OPEN_ERROR = 111 ; // 无法启动 app
int CODE_PARSE_ERROR = 112 ; // 数据解析错误
int CODE_IMAGE_COMPRESS_ERROR = 113 ; // 图片压缩失败
int CODE_PARAM_ERROR = 114 ; // 参数错误
int CODE_SDK_INIT_ERROR = 115 ; // SocialSdk 初始化错误
int CODE_PREPARE_BG_ERROR = 116 ; // 执行 prepareOnBackground 时错误
int CODE_NOT_SUPPORT = 117 ; // 不支持
예를 들어 다음과 같이 할 수 있습니다.
listener = new OnShareStateListener () {
@ Override
public void onState ( Activity act , ShareResult result ) {
switch ( result . state ) {
case ShareResult . STATE_FAIL :
SocialError e = result . error ;
showMsg ( "分享失败 " + e . toString ());
// 如下因为没有存储权限导致失败,请求权限
if ( Build . VERSION . SDK_INT >= Build . VERSION_CODES . M ) {
if ( e . getCode () == SocialError . CODE_STORAGE_READ_ERROR ) {
requestPermissions ( new String []{ Manifest . permission . READ_EXTERNAL_STORAGE }, 100 );
} else if ( e . getCode () == SocialError . CODE_STORAGE_WRITE_ERROR ) {
requestPermissions ( new String []{ Manifest . permission . WRITE_EXTERNAL_STORAGE }, 100 );
}
}
break ;
}
}
};
public class HuaweiPlatform extends AbsPlatform {
// 工厂函数
public static class Factory implements PlatformFactory {
@ Override
public IPlatform create ( Context context , int target ) {
return new HuaweiPlatform ( context , null , null , target );
}
@ Override
public int getPlatformTarget () {
return PLATFORM_HUAWEI ;
}
@ Override
public boolean checkShareTarget ( int shareTarget ) {
return false ;
}
@ Override
public boolean checkLoginTarget ( int loginTarget ) {
return loginTarget == LOGIN_HUAWEI ;
}
}
public HuaweiPlatform ( Context context , String appId , String appName , int target ) {
super ( context , appId , appName , target );
}
}
가장 중요한 것은 플랫폼의 팩토리 기능을 작성하는 것입니다. 프레임워크는 이를 자동으로 검색하고 시스템에 등록합니다. 수동으로 등록할 필요가 없습니다.
SocialSdk
내부적으로 수명주기를 자동으로 관리합니다. 로그인 공유를 시작하는 Activity
AppCompatActivity
직접 사용할 수 있으며 수명주기가 LifecycleOwner
되는 것이 좋습니다. 내부적으로 메모리 누수 발생을 방지합니다.
QQ:
libs/open_sdk_r2973327_lite.jar
2019.12로 업데이트되었습니다.위챗:
com.tencent.mm.opensdk:wechat-sdk-android-without-mta:5.5.8
2020.1.22로 업데이트됨웨이보:
com.sina.weibo.sdk:core:4.3.7:openDefaultRelease@aar
딩톡:
com.alibaba.android:ddsharesdk:1.1.0