Dernière version (1.2.0) Plus simple, plus léger, plus orienté business
Avec pour objectif de conception d'être plus simple, plus léger et plus orienté vers les besoins de l'entreprise, il fournit une prise en charge des fonctions de connexion et de partage pour Weibo , WeChat , QQ , Tim , QQ chat version et DingTalk ;
Adresse du projet : GitHub - SocialSdkLibrary
Adresse du blog : accès rapide à la connexion et au partage natifs de WeChat, Weibo, QQ et DingTalk
? La version du SDK WeChatQQWeibo peut être mise à niveau Lorsque la prochaine version sera mise à niveau, Weibo subira des changements majeurs ;
? 362 le 2020.1.21 ? La, version 1.2.0
, mise à jour du plug-in, prend en charge la dernière version de Gradle
, utilise Gradle + APT + ASM
pour découvrir automatiquement les classes Platform
, enregistre automatiquement le code d'initialisation et intègre analyse json
et requêtes http
, initialisation La configuration est plus simple ;
? 2019.6.13 Prise en charge de la connexion par code de numérisation WeChat
? Le 28 mai 2019, le projet a reçu le 329ème ?, a géré automatiquement le cycle de vie, les paramètres de rappel unifiés et a publié la version stable 1.0.1 ❤️,
? 2019.3.28 Utiliser gradle plugin
pour gérer automatiquement les dépendances, repenser le numéro de version, version stable 0.1.1 ❤️
? 2018.12.27 Plug-in gradle
terminé, plateforme divisée, dépendances automatisées, un nouveau niveau ?
? 2018.12.21 Déjà 225 ?, je commence à me préparer à me diviser en différentes bibliothèques de plates-formes pour faciliter un accès flexible⛽️
? Le 26 septembre 2018, le projet a reçu la 202ème étoile Merci aux nouveaux collègues pour avoir complété 2 étoiles ?
? Le 7 juin 2018, le projet a reçu la 100ème pierre ?, et la dernière est celle que j'ai demandée à mes collègues ?
? 2018.5.12 Correction d'un problème de mémoire et fonction étendue vers la version stable 1.1.0 ❤️
? 2018.2.12 Prise en charge du partage DingTalk ?
? 2017.12.12 Refactoring simple du code et test de la version stable 1.0.0 ❤️
Open source : pas d’œufs de Pâques, pas d’œufs de Pâques, pas d’œufs de Pâques ;
Simple : il suffit de prêter attention à la connexion, à la classe de gestion de partage et à un objet de structure de données, et il n'est pas nécessaire de prêter attention aux différences entre les plates-formes ;
Léger : il ne contient que SDK
tiers et un framework asynchrone simple (38k). Les requêtes réseau et l'analyse JSON
sont injectées de l'extérieur, réduisant les dépendances redondantes et garantissant un haut degré d'unité avec le projet hôte ;
Complet : partage de mini programmes, copie de liens, scan de QR codes pour se connecter, promotion du transport intermodal, etc. ;
Conception basée sur les exigences :
code
localement et le serveur obtient token
?wxOnlyAuthCode
;web
pour des raisons de compatibilité ;Intent
pour réactiver le partage, comme la prise en charge du partage vidéo local, le partage de texte brut qq
, etc. ;token
de manière persistante pour éviter plusieurs autorisations. Vous pouvez choisir la période de validité la prochaine fois que le jeton sera autorisé, les données pourront être obtenues directement. Cependant, si l'utilisateur change de compte WeChat, il ne pourra pas changer de compte. le temps doit être soigneusement étudié ;SocialSdk
; ÉTAPE 1 : Ajouter le chemin de dépendance du plugin
projet/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" }
}
}
ÉTAPE2 : Paramètres de configuration
app/build.gralde
Pour des raisons de sécurité, il est recommandé de le configurer dans local.properties
, afin d'éviter de le soumettre au serveur distant ;
// 在顶部引用插件
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 configuration ci-dessus est la plus simple. Pour plus de paramètres de configuration, veuillez vous référer à la configuration par défaut :
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 { }
}
ÉTAPE 3 : Initialisation
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 fonction de connexion prend en charge trois plates-formes, QQ, WeChat et Weibo ;
// 3个平台
Target . LOGIN_QQ ; // QQ 登录
Target . LOGIN_WX ; // 微信 登录
Target . LOGIN_WX_SCAN ; // 微信扫码 登录
Target . LOGIN_WB ; // 微博 登录
La connexion renverra LoginResult
, qui comprend principalement trois parties : le type de connexion, les informations utilisateur de base et les informations sur le jeton ;
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 ;
}
Vous devez définir un rappel de connexion lors de la connexion :
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 ;
}
}
};
Obtenez plus d’informations sur l’utilisateur :
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 ;
}
Initier la connexion :
LoginManager . login ( mActivity , Target . LOGIN_QQ , listener );
Connectez-vous avec des paramètres, tels que scanner le code QR WeChat pour vous connecter :
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 );
Concernant le vieillissement token
, vous pouvez définir tokenExpiresHours
lors de l'initialisation pour le contrôler. Il fournit également une méthode pour effacer le token
d'autorisation.
// 清除全部平台的 token
LoginManager . clearAllToken ( context );
// 清除指定平台的 token
LoginManager . clearToken ( context , Target . LOGIN_QQ );
Important : Veuillez examiner attentivement les capacités de prise en charge entre les plates-formes et les types de données.
Lorsque Weibo utilise openApi
pour partager, il peut y avoir un long délai. Il est recommandé d'ajouter une barre de progression dans le cycle de vie pour éviter que les utilisateurs n'attendent longtemps sans répondre.
Pour la logique métier et la conception SDK
, les types de données partagées sont divisés en 7 types, qui peuvent couvrir la plupart des scénarios métier, à savoir :
开启 App 类型,打开渠道应用;
文字类型,纯文本分享;
图片类型(jpg, png, gif(要求能动));
App 推广类型;
网页链接类型;
音频分享类型;
视频分享类型;
Afin de garantir que chaque plateforme ait une apparence fermée et unifiée, si une plateforme n'est pas compatible avec un certain type de partage, le partage web
sera utilisé à la place ; par exemple, WeChat ne prend pas en charge le partage app
et le mode de partage web
le fera ; être utilisé après le partage.
// 支持的分享渠道
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 ; // 粘贴板分享
Lors du partage, nous devons d'abord construire les données à partager. L'objet ShareObj
fournit une variété de méthodes statiques pour créer rapidement des objets correspondant au type de partage ;
// 测试用的路径
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 );
Utilisez la prise en charge étendue des paramètres pour certains paramètres qui ne peuvent pas être unifiés :
// 使 ShareObj 支持短信分享
webObj . setSmsParams ( "13611301719" , "说啥呢" );
// 使 ShareObj 支持粘贴板分享
webObj . setClipboardParams ( "复制的内容" );
// 使 ShareObj 支持邮件分享
webObj . setEMailParams ( "[email protected]" , "主题" , "内容" );
// 使 ShareObj 在微信平台优先使用小程序分享
webObj . setWxMiniParams ( "51299u9**q31" , SocialValues . WX_MINI_TYPE_RELEASE , "/page/path" );
Utilisez OnShareStateListener
comme rappel de partage d'écoute ;
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 );
Concernant la réécriture de l'objet de partage, cela offre en fait la possibilité de traiter uniformément ShareObj
qui doit être partagé avant le partage, ce qui est similaire à un aspect de la fonction de partage, comme le scénario suivant :
app
doit être ajouté à l'image avant de la partager ;url
partagée comporte des paramètres publics tels que shareId
etc., et les statistiques d'accès sont effectuées en H5
; Pour réécrire les objets partagés, nous utilisons des intercepteurs pour y parvenir. Les intercepteurs sont injectés lorsque SDK
est initialisé. Plusieurs intercepteurs sont pris en charge et différentes entreprises peuvent être divisées en différents intercepteurs.
UI
vous devez l'exécuter dans le 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 );
Nous rencontrons généralement des exigences lors du partage, telles que la copie dans le presse-papier/la prise en charge du partage de SMS/la prise en charge du partage d'e-mails, etc. SocialSdk
a intégré ces fonctions et des paramètres supplémentaires doivent être ajoutés après la création ShareObj
pour les implémenter ;
shareObj . setSmsParams ( "13611301719" , "说啥呢" );
shareObj . setEMailParams ( "[email protected]" , "主题" , "内容" );
shareObj . setClipboardParams ( "复制的内容" );
Prend en charge le partage d'applets WeChat, également en utilisant la forme de paramètres supplémentaires
shareObj . setWxMiniParams ( "51299u9**q31" , SocialValues . WX_MINI_TYPE_RELEASE , "/page/path" );
Afin de mieux unifier et partager les exceptions renvoyées en cas d'échec, toutes les exceptions renvoyées auront un code
, qui peut localiser les problèmes et donner des invites plus conviviales basées sur différents 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 ; // 不支持
Par exemple vous pouvez faire ceci :
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 );
}
}
Le plus important est d'écrire la fonction d'usine de la plateforme. Le framework la découvrira et l'enregistrera automatiquement dans le système. Il n'est pas nécessaire de s'enregistrer manuellement ;
SocialSdk
dispose d'une gestion automatique du cycle de vie en interne.Toutes les ressources seront recyclées après chaque partage de connexion. Il est recommandé que Activity
initie le partage de connexion implémente LifecycleOwner
interface AppCompatActivity
et que le cycle de vie soit lié. en interne pour éviter les fuites de mémoire ;
QQ :
libs/open_sdk_r2973327_lite.jar
mis à jour avec 2019.12WeChat :
com.tencent.mm.opensdk:wechat-sdk-android-without-mta:5.5.8
mis à jour avec 2020.1.22Weibo :
com.sina.weibo.sdk:core:4.3.7:openDefaultRelease@aar
DingTalk :
com.alibaba.android:ddsharesdk:1.1.0