最新バージョン (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 日、プロジェクトは 2 つ星を獲得したおかげで 202 つ星を獲得しました。
? 2018 年 6 月 7 日に、プロジェクトは 100 個目の石を受け取りました?、最後の 1 つは私が同僚に頼んだものでした?
? 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 : 設定パラメータ
app/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 つのプラットフォームをサポートしています。
// 3个平台
Target . LOGIN_QQ ; // QQ 登录
Target . LOGIN_WX ; // 微信 登录
Target . LOGIN_WX_SCAN ; // 微信扫码 登录
Target . LOGIN_WB ; // 微博 登录
Login はLoginResult
を返します。これには主に、ログイン タイプ、基本的なユーザー情報、トークン情報の 3 つの部分が含まれます。
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 オブジェクトには、共有の種類に対応するオブジェクトを迅速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 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