应老大的要求,我开始正式接入友盟的微社区,从微社区的内测版1.2版本到现在的上线版2.1版本,我都几乎全程参与了,在这其中也遇到了很多问题,比如自己的账号系统和微社区中的第三方登录的账户系统整合、微信登陆爆机、账号注销不成功等等……现在使用2.1版本的微社区SDK已经可以基本实现社区的功能了。下面我来分享下自己是如何接入的:
1、微信登陆爆机或者不成功
官网上有的Mainfest文件中的权限、Activity、Service等组件的添加,这些就不在这里介绍了,请参考官网给出的文档:http://dev.umeng.com/wsq/android/quick-integration
在这里需要注意下,可能你的微信登陆不成功或者爆机,很可能原因就是Mainfest文件中的:
<!-- 微信登录 -->
<activity android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
这里注意这段代码不能修改,即使修改的和这样的一样也不行(至于原因我也不是很清楚)。。。
如图所示,微信的回调类要对应在包名.wxapi 类中。
当然,微信登陆成功的前提是你获得了微信登陆权限……这里就不多说了
记得在使用时将你的微信appKey和values填入:
protected void useSocialLogin() {
String wxappId = "xxxxxxxxxxxxxxxxx";
String wxappSecret = "xxxxxxxxxxxxxxxxxxxxxxxx";
new UMWXHandler(getApplicationContext(), wxappId,
wxappSecret).addToSocialSDK();
}
下面,我们来看看接入微社区的代码吧:
2、使用自己的账号系统来接入微社区,实现登陆时跳转到自己的登陆页面
LoginSDKManager.getInstance().addAndUse(new CustomLoginImpl());
CustomLoginImpl是自定义实现登录系统,实现Loginable中的三个方法。
SDK内部在登录时会调用login函数,如果你的登录界面是Activity, 那么需要自己将LoginListener传递给你的登录Activity并且最后将结果回调给微社区SDK,登录成功那么返回码为200,否则视为登录失败。
另外需要注意的是是否登录的标识应该存储到本地,而不应该存储在内存中。如果存储在内存中,那么下次重新进入应用是 isLogin被置为false,造成重复登录。
public class CustomLoginImpl implements Loginable {
// !不要使用成员变量存储是否登录的状态,应该保存在本地
private boolean isLogin = false;
@Override
public void login(Context context, final LoginListener listener) {
// 跳转到你的Activity
if (!MC.pref.getBooleanShareData("isLogin", false))
{
// 包装一下Listener
CustonLoginActivitysLoginListener = new LoginListener() {
@Override
public void onStart() {
listener.onStart();
}
@Override
public void onComplete(int stCode, CommUser userInfo) {
if (stCode == 200) {
isLogin = true;
}
setUmengPush(userInfo);
listener.onComplete(stCode, userInfo);
}
};
Intent intent = new Intent(context,CustonLoginActivity.class);
intent.putExtra("isOpenLoginView", true);
context.startActivity(intent);
} else
{
String userInfo = MC.pref.getStringShareData("user", true);
JSONObject testData = null;
try
{
testData = new JSONObject(userInfo);
} catch (JSONException e)
{
e.printStackTrace();
}
UserNode userNode = new UserNode(testData);
// 注意用户id、昵称、source是必填项
CommUser user = new CommUser(Logic.UID);
user.id = Logic.UID;
// 登录的来源.可使用值参考文档中SOURCE的取值说明
user.source = Source.SELF_ACCOUNT;
user.name = userNode.getNickName();
user.customField = userNode.getEmail();
RL.d("--->", "信息--id==" + user.id + "--source==" + user.source + "--name==" + user.name);
// 如果没有头像地址,可不传递
user.iconUrl = ServerCfg.IMAGE_PREFIX + userNode.getUserIcon();
isLogin = true;
setUmengPush(user);
listener.onComplete(200, user);
}
}
@Override
public void logout(Context context, LoginListener listener) {
Log.d("", "### 注销登录 ");
MC.pref.storeBooleanShareData("isLogin", false);
MC.pref.storeShareData("user", new UserNode().toJSONObject().toString().getBytes());
//置空微社区的账号
cleanUmCommUser();
isLogin = false;
listener.onComplete(200, null);
}
@Override
public boolean isLogined(Context context) {
Log.d("", "### 这里需要将是否已经登录的状态存到本地,避免下次重新进入应用是 isLogin被置为false");
if (MC.pref.getBooleanShareData("isLogin", false))
isLogin = true;
else isLogin = false;
return isLogin;
}
/**
* 设置微社区的推送功能功能
*
* @param user
*/
private void setUmengPush(CommUser user)
{
UmengPushImpl umengPushImpl = new UmengPushImpl();
umengPushImpl.enable(MC.application);
umengPushImpl.setUserAlias(user);
PushSDKManager.getInstance().addAndUse(umengPushImpl);
}
/**
* 清空友盟微社区的用户信息
*/
private void cleanUmCommUser()
{
// 清空SDK内部保存的用户信息
CommonUtils.logout();
// 置空用户信息
CommConfig.getConfig().loginedUser = new CommUser();
}
}
CustonLoginActivity就是你的登陆页面对应的Activity,在登陆成功销毁这个Activity时,把用户信息回调给社区SDK:
/**
* 模拟用户登录操作,自定义过程中用户可以构造用户名、密码输入界面
*/
private void mockLoginData() {
Log.d("", "### 使用自己的账户系统登录,然后将标识用户唯一性的id和source传递给社区SDK ");
Random random = new Random();
CommUser loginedUser = new CommUser();
String userId = "id" + random.nextInt(Integer.MAX_VALUE);
loginedUser.id = userId; // 用户id
loginedUser.name = "name" + random.nextInt(Integer.MAX_VALUE); // 用户名
loginedUser.source = Source.SELF_ACCOUNT;// 登录系统来源
loginedUser.gender = Gender.FEMALE;// 用户性别
loginedUser.level = random.nextInt(100); // 用户等级
loginedUser.score = random.nextInt(100);// 积分
if (sLoginListener != null) {
// 登录完成回调给社区SDK,200代表登录成功
sLoginListener.onComplete(200, loginedUser);
}
}
这样就可以使用自己的登陆页面来登陆进入微社区啦,快来试试吧~
3、使用微社区登陆账号注销不了(切换为别的账号后,仍然是第一次登陆的账号)
这里需要在退出登陆的时候,置空微社区中的账号,代码如下:
// 清空SDK内部保存的用户信息
CommonUtils.logout();
// 置空用户信息
CommConfig.getConfig().loginedUser = new CommUser();