这半年做的项目被大老板 ban 掉了,略伤感。。。
这几天整理了一下项目中负责的社会化登录和分享模块,SDK 集成本身是很简单的事情,但是三家平台的接口差异很大,如果只见简单的把代码垒在一起,几乎不可以复用,扩展性和可维护性为零。所以简单抽象了一下接口,提供 aar 库。
其实,像友盟,ShareSDK 等平台也提供类似的 SDK,之所以造轮子是因为这些平台的 SDK 内部肯定会带有数据统计功能,不想给他们共享数据。
当前已经实现社会化登录功能,分享功能 ing
项目地址: https://github.com/ElbbbirdStudio/ESSocialSDK
社交登录授权,分享 SDK
支持微信、微博、QQ 登录授权
微信好友、微信朋友圈、微博、QQ 好友、QQ 空间分享
compile 'com.elbbbird.android:socialsdk:0.1.0@aar'
SocialSDK.setDebugMode(true); //默认 false
ISocialOauthCallback
授权回调接口ISocialOauthCallback callback = new ISocialOauthCallback() {
@Override
public void onGetTokenSuccess(SocialToken token) {
//获取 token 成功
Log.i(TAG, "onGetTokenSuccess" + token.toString());
}
@Override
public void onGetUserSuccess(SocialUser user) {
//获取用户信息成功
Log.i(TAG, "onGetUserSuccess# " + user.toString());
}
@Override
public void onFailure(Exception e) {
//失败
Log.i(TAG, "onFailure# " + e.toString());
}
@Override
public void onCancel() {
//取消
Log.i(TAG, "onCancel#");
}
};
http://www.sina.com
,需要在微博后台配置,否则会提示回调地址错误。SocialSDK.initWeibo()
方法自定义了回调地址,需要在后台配置为相应地址。java
SocialSDK.initWeibo("app_key");
SocialSDK.oauthWeibo(context, callback);
onActivityResult
SocialSDK.oauthWeiboCallback(context, requestCode, resultCode, data);
revoke
SocialSDK.revokeWeibo(context);
package_name.wxapi
WXEntryActivity
继承自WXCallbackActivity
package com.encore.actionnow.wxapi;
public class WXEntryActivity extends WXCallbackActivity {
}
AndroidManifest.xml
<activity
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
oauth
SocialSDK.initWeChat("app_id", "app_secret");
SocialSDK.oauthWeChat(context, callback);
revoke
SocialSDK.revokeWeChat(context);
AndroidManifest.xml
<activity
android:name="com.tencent.tauth.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tencentXXXXXXXXX" />
</intent-filter>
</activity>
以上配置中的XXXXXXXXX
换成 app_id.
oauth
SocialSDK.initQQ(app_id);
SocialSDK.oauthQQ(context, callback);
onActivityResult
if (requestCode == Constants.REQUEST_LOGIN || requestCode == Constants.REQUEST_APPBAR) {
SocialSDK.oauthQQCallback(requestCode, resultCode, data);
}
revoke
SocialSDK.revokeQQ(context);
配置微博后台回调地址
SDK 的默认回调地址为http://www.sina.com
,需要在微博后台配置,否则会提示回调地址错误。
如果在SocialSDK.init()
方法自定义了回调地址,需要在后台配置为相应地址。
WXEntryActivity
创建包名:package_name.wxapi
在该包名下创建类WXEntryActivity
继承自WXCallbackActivity
package com.encore.actionnow.wxapi;
public class WXEntryActivity extends WXCallbackActivity {
}
AndroidManifest.xml
<activity
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity
android:name="com.tencent.tauth.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tencentXXXXXXXXX" />
</intent-filter>
</activity>
以上配置中的XXXXXXXXX
换成 app_id.
oauth
SocialSDK.init("wechat_app_id", "wechat_app_secret", "weibo_app_id", "qq_app_id");
SocialSDK.oauth(context);
授权结果回调
SDK 使用了Otto作为事件库,用以组件通信。(其实我是不想写 startActivityForResult ...)
在调用SocialSDK.oauth()
接口Activity
的onCreate()
方法内添加
BusProvider.getInstance().register(this);
在该Activity
的onDestroy()
方法添加
@Override
protected void onDestroy() {
BusProvider.getInstance().unregister(this);
super.onDestroy();
}
添加回调接口
@Subscribe
public void onOauthResult(BusEvent event) {
switch (event.getType()) {
case BusEvent.TYPE_GET_TOKEN:
SocialToken token = event.getToken();
Log.i(TAG, "onOauthResult#BusEvent.TYPE_GET_TOKEN " + token.toString());
break;
case BusEvent.TYPE_GET_USER:
SocialUser user = event.getUser();
Log.i(TAG, "onOauthResult#BusEvent.TYPE_GET_USER " + user.toString());
break;
case BusEvent.TYPE_FAILURE:
Exception e = event.getException();
Log.i(TAG, "onOauthResult#BusEvent.TYPE_FAILURE " + e.toString());
break;
case BusEvent.TYPE_CANCEL:
Log.i(TAG, "onOauthResult#BusEvent.TYPE_CANCEL");
break;
}
}
revoke
SocialSDK.revoke(context);
关于三个平台的账号
微博应用程序注册完成后,需要在后台配置测试账号,包名,签名信息,然后开始测试;
微信应用程序注册后,需要配置包名和签名,并提交审核通过,可以获得分享权限。SSO 登录权限需要开发者认证。(保护费不到位,测试都不能做)
QQ 需要在后台配置测试账号才能 SSO 登录。
是否需要配置权限?
SDK 已经在 aar 中添加三个平台需要的权限,以下
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />