Versão mais recente (1.2.0) Mais fácil, mais leve e mais voltada para os negócios
Com o objetivo de design de ser mais simples, leve e mais orientado às necessidades de negócios, ele fornece suporte para funções de login e compartilhamento para Weibo , WeChat , QQ , Tim , versão de chat QQ e DingTalk ;
Endereço do projeto: GitHub - SocialSdkLibrary
Endereço do blog: Acesso rápido ao login e compartilhamento nativo do WeChat, Weibo, QQ e DingTalk
?A versão WeChatQQWeibo SDK pode ser atualizada Quando a próxima versão for atualizada, o Weibo passará por grandes mudanças;
?362 em 2020.1.21?La, versão lançada 1.2.0
, atualização de plug-in, suporta a versão mais recente do Gradle
, usa Gradle + APT + ASM
para descobrir automaticamente as classes Platform
, registra automaticamente o código de inicialização e possui integração análise json
e solicitações http
, inicialização A configuração é mais simples;
? 2019.6.13 Suporte para login do código de verificação do WeChat
?Em 28 de maio de 2019, o projeto recebeu o 329º ?, gerenciou automaticamente o ciclo de vida, unificou os parâmetros de retorno de chamada e lançou a versão estável 1.0.1 ❤️,
? 2019.3.28 Use gradle plugin
para gerenciar dependências automaticamente, redesenhar o número da versão, versão estável 0.1.1 ❤️
? 27/12/2018 Plug-in gradle
concluído, plataforma dividida, dependências automatizadas, um novo nível?
?2018.12.21 Já tem 225?, começando a se preparar para dividir em diferentes bibliotecas de plataforma para facilitar o acesso flexível⛽️
?Em 26 de setembro de 2018, o projeto recebeu a 202ª estrela. Obrigado aos novos colegas pela complementação de 2 estrelas.
?No dia 7 de junho de 2018, o projeto recebeu a centésima pedra?, e a última foi a que pedi aos meus colegas?
? 2018.5.12 Corrigido problema de memória e função estendida para a versão estável 1.1.0 ❤️
?2018.2.12 Suporta compartilhamento DingTalk?
? 2017.12.12 Refatoração simples do código e teste da versão estável 1.0.0 ❤️
Código aberto: sem ovos de Páscoa, sem ovos de Páscoa, sem ovos de Páscoa;
Simples: você só precisa prestar atenção ao login, classe de gerenciamento de compartilhamento e objeto de estrutura de dados, e não há necessidade de prestar atenção às diferenças entre plataformas;
Leve: contém apenas SDK
de terceiros e uma estrutura assíncrona simples (38k). Solicitações de rede e análise JSON
são injetadas de fora, reduzindo dependências redundantes e garantindo um alto grau de unidade com o projeto host;
Abrangente: compartilhamento de miniprogramas, cópia de links, leitura de códigos QR para login, promoção de transporte intermodal, etc.;
Design baseado em requisitos:
code
apenas localmente e o servidor obtém token
?wxOnlyAuthCode
;web
para compatibilidade;Intent
para ativar o compartilhamento, como suporte para compartilhamento de vídeo local, compartilhamento de texto simples qq
, etc.;token
de forma persistente para evitar múltiplas autorizações. Você pode escolher o período de validade. Na próxima vez que o token for autorizado, os dados poderão ser obtidos diretamente. o tempo deve ser cuidadosamente considerado;SocialSdk
; PASSO 1 : Adicionar caminho de dependência do plugin
projeto/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" }
}
}
PASSO 2 : Parâmetros de configuração
app/build.gralde
Por questões de segurança, recomenda-se configurá-lo em local.properties
, para evitar submetê-lo ao extremo remoto;
// 在顶部引用插件
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'
}
}
A configuração acima é a mais simples. Para mais parâmetros de configuração, consulte a configuração padrão:
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 { }
}
PASSO 3 : Inicialização
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 );
A função de login suporta três plataformas, QQ, WeChat e Weibo;
// 3个平台
Target . LOGIN_QQ ; // QQ 登录
Target . LOGIN_WX ; // 微信 登录
Target . LOGIN_WX_SCAN ; // 微信扫码 登录
Target . LOGIN_WB ; // 微博 登录
Login retornará LoginResult
, que inclui principalmente três partes: tipo de login, informações básicas do usuário e informações do token;
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 ;
}
Você precisa definir um retorno de chamada de login ao fazer login:
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 ;
}
}
};
Obtenha mais informações do usuário:
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 ;
}
Iniciar login:
LoginManager . login ( mActivity , Target . LOGIN_QQ , listener );
Faça login com parâmetros, como digitalizar o código QR do WeChat para fazer login:
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 );
Em relação ao vencimento token
, você pode definir tokenExpiresHours
durante a inicialização para controlá-lo. Ele também fornece um método para limpar o token
de autorização.
// 清除全部平台的 token
LoginManager . clearAllToken ( context );
// 清除指定平台的 token
LoginManager . clearToken ( context , Target . LOGIN_QQ );
Importante: revise cuidadosamente os recursos de suporte entre plataformas e tipos de dados
Quando o Weibo usa openApi
para compartilhar, pode haver um longo atraso. Recomenda-se adicionar uma exibição da barra de progresso no ciclo de vida para evitar que os usuários esperem muito tempo sem responder.
Para lógica de negócios e design SDK
, os tipos de dados compartilhados são divididos em 7 tipos, que podem cobrir a maioria dos cenários de negócios, a saber:
开启 App 类型,打开渠道应用;
文字类型,纯文本分享;
图片类型(jpg, png, gif(要求能动));
App 推广类型;
网页链接类型;
音频分享类型;
视频分享类型;
Para garantir que cada plataforma tenha uma aparência fechada e unificada, se uma plataforma não for compatível com um determinado tipo de compartilhamento, será utilizado o compartilhamento web
, por exemplo, o WeChat não oferece suporte ao compartilhamento app
, e o modo de compartilhamento web
será; ser usado após o compartilhamento.
// 支持的分享渠道
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 ; // 粘贴板分享
Ao compartilhar, devemos primeiro construir os dados para compartilhamento. O objeto ShareObj
fornece uma variedade de métodos estáticos para criar rapidamente objetos correspondentes ao tipo de compartilhamento;
// 测试用的路径
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 );
Use suporte estendido a parâmetros para alguns parâmetros que não podem ser unificados:
// 使 ShareObj 支持短信分享
webObj . setSmsParams ( "13611301719" , "说啥呢" );
// 使 ShareObj 支持粘贴板分享
webObj . setClipboardParams ( "复制的内容" );
// 使 ShareObj 支持邮件分享
webObj . setEMailParams ( "[email protected]" , "主题" , "内容" );
// 使 ShareObj 在微信平台优先使用小程序分享
webObj . setWxMiniParams ( "51299u9**q31" , SocialValues . WX_MINI_TYPE_RELEASE , "/page/path" );
Use OnShareStateListener
como retorno de chamada de compartilhamento de escuta;
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 );
Quanto à reescrita do objeto de compartilhamento, ele realmente oferece uma oportunidade de processar uniformemente ShareObj
que precisa ser compartilhado antes do compartilhamento, o que é semelhante a um aspecto da função de compartilhamento, como o seguinte cenário:
app
precisa ser adicionada à imagem antes de compartilhá-la;url
compartilhada carrega parâmetros públicos como shareId
etc., e as estatísticas de acesso são feitas em H5
; Para reescrever objetos compartilhados, usamos interceptores para conseguir isso. Os interceptores são injetados quando SDK
é inicializado. Vários interceptadores são suportados e diferentes negócios podem ser divididos em diferentes interceptadores.
UI
será necessário executá-lo no thread principal;
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 );
Geralmente encontramos requisitos ao compartilhar, como copiar para a área de trabalho/suporte para compartilhamento de SMS/suporte para compartilhamento de e-mail, etc. SocialSdk
possui essas funções integradas e parâmetros adicionais precisam ser adicionados após a criação ShareObj
para implementá-los;
shareObj . setSmsParams ( "13611301719" , "说啥呢" );
shareObj . setEMailParams ( "[email protected]" , "主题" , "内容" );
shareObj . setClipboardParams ( "复制的内容" );
Suporta compartilhamento de miniaplicativos WeChat, também usando a forma de parâmetros adicionais
shareObj . setWxMiniParams ( "51299u9**q31" , SocialValues . WX_MINI_TYPE_RELEASE , "/page/path" );
Para melhor unificar e compartilhar as exceções retornadas quando ocorre uma falha, todas as exceções retornadas terão um code
, que pode localizar problemas e fornecer prompts mais amigáveis baseados em code
diferentes.
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 ; // 不支持
Por exemplo, você pode fazer isso:
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 );
}
}
O mais importante é escrever a função de fábrica da plataforma. O framework irá descobri-la e registrá-la automaticamente no sistema.
SocialSdk
possui gerenciamento automático do ciclo de vida internamente. Todos os recursos serão reciclados após a conclusão de cada compartilhamento de login. Recomenda-se que Activity
inicia o compartilhamento de login implemente LifecycleOwner
interface AppCompatActivity
e que o ciclo de vida seja vinculado. internamente para evitar a ocorrência de vazamentos de memória;
QQ:
libs/open_sdk_r2973327_lite.jar
atualizado com 2019.12WeChat:
com.tencent.mm.opensdk:wechat-sdk-android-without-mta:5.5.8
atualizado com 2020.1.22Weibo:
com.sina.weibo.sdk:core:4.3.7:openDefaultRelease@aar
DingTalk:
com.alibaba.android:ddsharesdk:1.1.0