Última versión (1.2.0) Más fácil, más ligera y más orientada a los negocios
Con el objetivo de diseño de ser más simple, liviano y más orientado a las necesidades comerciales, proporciona soporte para funciones de inicio de sesión y uso compartido para Weibo , WeChat , QQ , Tim , versión de chat QQ y DingTalk ;
Dirección del proyecto: GitHub-SocialSdkLibrary
Dirección del blog: acceso rápido al inicio de sesión y uso compartido nativos de WeChat, Weibo, QQ y DingTalk
? La versión del SDK de WeChatQQWeibo se puede actualizar. Cuando se actualice la próxima versión, Weibo sufrirá cambios importantes;
?362 el 2020.1.21? La, versión lanzada 1.2.0
, actualización del complemento, admite la última versión de Gradle
, usa Gradle + APT + ASM
para descubrir automáticamente clases Platform
, registra automáticamente el código de inicialización y tiene funciones integradas. análisis json
y solicitudes http
, inicialización La configuración es más simple;
2019.6.13 Admite inicio de sesión con código de escaneo de WeChat
?El 28 de mayo de 2019, el proyecto recibió el número 329?, administró automáticamente el ciclo de vida, unificó los parámetros de devolución de llamada y lanzó la versión estable 1.0.1 ❤️,
2019.3.28 Utilice gradle plugin
para administrar automáticamente las dependencias, rediseñar el número de versión, versión estable 0.1.1 ❤️
2018.12.27 Complemento gradle
completo, plataforma dividida, dependencias automatizadas, ¿un nuevo nivel?
2018.12.21 ¿Ya son 225?, comenzando a prepararse para dividirse en diferentes bibliotecas de plataformas para facilitar el acceso flexible⛽️
? El 26 de septiembre de 2018, el proyecto recibió la estrella número 202. ¿Gracias a los nuevos colegas por complementar 2 estrellas?
?El 7 de junio de 2018, ¿el proyecto recibió la piedra número 100?, ¿y la última fue la que les pedí a mis compañeros?
2018.5.12 Se solucionó el problema de memoria y se extendió la función a la versión estable 1.1.0 ❤️
2018.2.12 ¿Admite compartir DingTalk?
2017.12.12 Refactorización simple del código y prueba de la versión estable 1.0.0 ❤️
Código abierto: sin huevos de Pascua, sin huevos de Pascua, sin huevos de Pascua;
Simple: solo necesita prestar atención al inicio de sesión, la clase de administración compartida y un objeto de estructura de datos, y no es necesario prestar atención a las diferencias entre plataformas;
Ligero: solo contiene SDK
de terceros y un marco asincrónico simple (las solicitudes de red de 38k y el análisis JSON
se inyectan desde el exterior, lo que reduce las dependencias redundantes y garantiza un alto grado de unidad con el proyecto anfitrión);
Integral: compartir mini programas, copiar enlaces, escanear códigos QR para iniciar sesión, promover el transporte intermodal, etc.;
Diseño basado en requisitos:
code
localmente y el servidor obtiene token
?wxOnlyAuthCode
;web
para mayor compatibilidad;Intent
para activar el uso compartido, como admitir el uso compartido de videos locales, el uso compartido de texto sin formato qq
, etc.;token
de manera persistente para evitar autorizaciones múltiples. Puede elegir el período de validez. La próxima vez que se autorice el token, los datos se pueden obtener directamente. Sin embargo, si el usuario cambia su cuenta de WeChat, no puede cambiar de cuenta. el plazo debe considerarse cuidadosamente;SocialSdk
; PASO 1 : Agregar ruta de dependencia del complemento
proyecto/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" }
}
}
PASO 2 : Parámetros de configuración
aplicación/build.gralde
Por razones de seguridad, se recomienda configurarlo en local.properties
para evitar enviarlo al 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'
}
}
La anterior es la configuración más simple. Para obtener más parámetros de configuración, consulte la configuración predeterminada:
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 { }
}
PASO 3 : Inicialización
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 );
La función de inicio de sesión admite tres plataformas: QQ, WeChat y Weibo;
// 3个平台
Target . LOGIN_QQ ; // QQ 登录
Target . LOGIN_WX ; // 微信 登录
Target . LOGIN_WX_SCAN ; // 微信扫码 登录
Target . LOGIN_WB ; // 微博 登录
El inicio de sesión devolverá LoginResult
, que incluye principalmente tres partes: tipo de inicio de sesión, información básica del usuario e información del 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 ;
}
Debe configurar una devolución de llamada de inicio de sesión al iniciar sesión:
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 ;
}
}
};
Obtenga más información del usuario:
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 sesión:
LoginManager . login ( mActivity , Target . LOGIN_QQ , listener );
Inicie sesión con parámetros, como escanear el código QR de WeChat para iniciar sesión:
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 );
Con respecto al envejecimiento token
, puede configurar tokenExpiresHours
durante la inicialización para controlarlo. También proporciona un método para borrar el token
de autorización.
// 清除全部平台的 token
LoginManager . clearAllToken ( context );
// 清除指定平台的 token
LoginManager . clearToken ( context , Target . LOGIN_QQ );
Importante: revise cuidadosamente las capacidades de soporte entre plataformas y tipos de datos.
Cuando Weibo usa openApi
para compartir, puede haber un retraso prolongado. Se recomienda agregar una visualización de la barra de progreso en el ciclo de vida para evitar que los usuarios esperen mucho tiempo sin responder.
Para la lógica empresarial y el diseño SDK
, los tipos de datos compartidos se dividen en 7 tipos, que pueden cubrir la mayoría de los escenarios empresariales, a saber:
开启 App 类型,打开渠道应用;
文字类型,纯文本分享;
图片类型(jpg, png, gif(要求能动));
App 推广类型;
网页链接类型;
音频分享类型;
视频分享类型;
Para garantizar que cada plataforma tenga una apariencia cerrada y unificada, si una plataforma no es compatible con un determinado tipo de uso compartido, se utilizará el uso compartido web
, por ejemplo, WeChat no admite el uso compartido app
y el modo de uso compartido web
sí; ser utilizado después de compartir.
// 支持的分享渠道
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 ; // 粘贴板分享
Al compartir, primero debemos construir los datos para compartir. El objeto ShareObj
proporciona una variedad de métodos estáticos para crear rápidamente objetos correspondientes al tipo de compartir;
// 测试用的路径
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 );
Utilice soporte de parámetros extendido para algunos parámetros que no se pueden unificar:
// 使 ShareObj 支持短信分享
webObj . setSmsParams ( "13611301719" , "说啥呢" );
// 使 ShareObj 支持粘贴板分享
webObj . setClipboardParams ( "复制的内容" );
// 使 ShareObj 支持邮件分享
webObj . setEMailParams ( "[email protected]" , "主题" , "内容" );
// 使 ShareObj 在微信平台优先使用小程序分享
webObj . setWxMiniParams ( "51299u9**q31" , SocialValues . WX_MINI_TYPE_RELEASE , "/page/path" );
Utilice OnShareStateListener
como devolución de llamada para compartir escucha;
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 );
Con respecto a reescribir el objeto compartido, en realidad brinda la oportunidad de procesar de manera uniforme ShareObj
que debe compartirse antes de compartirlo, que es similar a un aspecto de la función compartida, como el siguiente escenario:
app
a la imagen antes de compartirla;url
compartida lleva parámetros públicos como shareId
etc., y las estadísticas de acceso se realizan en H5
; Para reescribir objetos compartidos, utilizamos interceptores para lograr esto. Los interceptores se inyectan cuando se inicializa SDK
. Se admiten varios interceptores y diferentes empresas se pueden dividir en diferentes interceptores. Todos los interceptores se llamarán secuencialmente.
UI
debe ejecutarla en el subproceso 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 );
Por lo general, encontramos requisitos al compartir, como copiar al tablero/compartir SMS/compartir correo electrónico, etc. SocialSdk
tiene estas funciones integradas y es necesario agregar parámetros adicionales después de crear ShareObj
para implementarlas;
shareObj . setSmsParams ( "13611301719" , "说啥呢" );
shareObj . setEMailParams ( "[email protected]" , "主题" , "内容" );
shareObj . setClipboardParams ( "复制的内容" );
Admite el uso compartido de subprogramas de WeChat, también mediante parámetros adicionales
shareObj . setWxMiniParams ( "51299u9**q31" , SocialValues . WX_MINI_TYPE_RELEASE , "/page/path" );
Para unificar y compartir mejor las excepciones devueltas cuando ocurre una falla, todas las excepciones devueltas tendrán un code
, que puede localizar problemas y brindar indicaciones más amigables basadas en diferentes 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 ; // 不支持
Por ejemplo puedes hacer esto:
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 );
}
}
Lo más importante es escribir la función de fábrica de la plataforma. El marco la descubrirá y registrará automáticamente en el sistema.
SocialSdk
tiene una gestión automática del ciclo de vida internamente. Todos los recursos se reciclarán después de que se complete cada inicio de sesión compartido. Se recomienda que Activity
inicia el inicio de sesión compartido implemente LifecycleOwner
AppCompatActivity
se pueda vincular el ciclo de vida. internamente para evitar pérdidas de memoria;
Pregunta:
libs/open_sdk_r2973327_lite.jar
actualizado con 2019.12WeChat:
com.tencent.mm.opensdk:wechat-sdk-android-without-mta:5.5.8
actualizado con 2020.1.22Weibo:
com.sina.weibo.sdk:core:4.3.7:openDefaultRelease@aar
DingTalk:
com.alibaba.android:ddsharesdk:1.1.0