项目需求实现新浪微博登录,并实现文章对第三方平台的分享,使用友盟SDK实现以上功能,在实现的过程中,踩了一些坑,记录下来和大家分享一下。
友盟提供了SSO(免登录)以及非SSO的方式。所谓SSO的方式,即当在本地安装了新浪微博客户端并已登录,则在本应用中无需再次输入用户名和密码实现登录。
【非SSO方式的实现】
无需做友盟后台的相关配置,走的是web页面的登录方式。
1,声明如下成员变量
private UMSocialService mController;
2,在当前Activity的onCreate方法中初始化
mController = UMServiceFactory.getUMSocialService(“com.umeng.login”);
3,新浪微博登录按钮的监听事件
mSinaWeiboLoginButton = findViewById(R.id.sina_weibo_login);
mSinaWeiboLoginButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mController.doOauthVerify(LoginActivity.this, SHARE_MEDIA.SINA,
new UMAuthListener() {
@Override
public void onError(SocializeException e,
SHARE_MEDIA platform) {
}
@Override
public void onComplete(Bundle value,
SHARE_MEDIA platform) {
if (value != null) {
getUserInfo(value.getString("uid"));
}
}
@Override
public void onCancel(SHARE_MEDIA platform) {
}
@Override
public void onStart(SHARE_MEDIA platform) {
}
});
}
});
doOauthVerify接口将调出新浪微博授权页面进行授权操作,用自己的新浪微博账号登录debug一下,在onComplete的回调方法里,返回的Bundle类型的value值如下:
access_key=2.00PNzcRC03t9ZI940ca19fc0fXYs5D
expires_in=628598
access_secret=2.00PNzcRC03t9ZI940ca19fc0fXYs5D
uid=2092755145
4,getUserInfo方法来获取用户的资料,通过调用getPlatformInfo来获取。
private void getUserInfo(String uid) {
mController.getPlatformInfo(LoginActivity.this, SHARE_MEDIA.SINA,
new SocializeListeners.UMDataListener() {
@Override
public void onStart() {
}
@Override
public void onComplete(int status, Map<String, Object> info) {
if (status == 200 && info != null) {
uuid = info.get("uid") + "";
sina_tonken = info.get("access_token") + "";
screen_name = info.get("screen_name") + "";
WeiboAuthorization authorization = new WeiboAuthorization();
authorization.setAccessToken(sina_tonken);
authorization.setUserId(uuid);
if(!Util.getSharePersistent(LoginActivity.this, "EXPIRES_IN").equals("")){
authorization.setExpiresIn(Integer.parseInt(Util.getSharePersistent(LoginActivity.this, "EXPIRES_IN")));
}
authorization.setRefreshToken(Util.getSharePersistent(LoginActivity.this, "REFRESH_TOKEN"));
authorization.setSource("sina");
new LoginAsyncTask().execute(authorization);
} else {
Toast.makeText(LoginActivity.this, "账号异常", Toast.LENGTH_SHORT).show();
}
}
});
}
调用getPlatformInfo接口,在onComplete方法中将用户资料以Map的结构返回,debug一下获取到的用户信息如下图所示,包括了用户名、头像、access_token等新浪微博的用户信息。
5,拿到这些数据之后,剩下的工作就是与本应用的服务端的交互工作,访问应用的登录接口了。
非SSO登录走的是网页的登录方式,且每次登录都需要输入用户名和密码,效果如下图所示:
【SSO方式】
1,通过友盟SDK实现免登,首先需要在新浪微博后台以及友盟后台做一些配置:
在新浪微博后台配置 安全域名以及授权回调页
将安全域名填写为sns.whalecloud.com ,注意填写之后需要二次审核(审核时间1个工作日),审核通过之后生效。
以上是新浪微博的默认授权回调页,如果不使用这个默认的授权回调页,则需要在代码中进行设置:
在友盟后台配置App Key 以及 App Secret【注意:在新浪微博后台安全域名以及授权回调页审核没有通过之前,不要配置友盟的后台信息,否则影响非SSO方式的线上用户!】
【SSO方式的代码实现】
【一些坑】
1,从非SSO方式改为SSO方式,一定要等新浪微博后台审核通过之后,再在Umeng后台配置App key以及App Secret,否则会影响线上用户,报:redirect_uri_mismatch 错误。
2,SSO方式必须是签名包,否则会报签名错误。
3,授权回调页如果不是新浪默认的授权回调页,则必须在代码中进行配置。
【参考】
http://dev.umeng.com/social/android/login-page#2_4
http://bbs.umeng.com/thread-5394-1-1.html