本篇博客要跟大家分享的是开发中我们常常遇到的账号绑定的功能开发,我们先来思考几个问题:
1. 为什么要有账号绑定?
2. 它跟第三方登录有什么不同?
3. 如何来处理账号绑定的相关逻辑?
好,带着这三个疑问,我们来为我们的应用开发账号绑定的功能。给大家看看一个效果图:
前面分享过关于第三方登录、分享的实现的博文:http://blog.csdn.net/wwj_748/article/details/41117173,大家可以先看一下,如何利用第三方SDK来实现第三方登录功能。
账号绑定其实也是社交的入口的手段之一,为了能让用户更方便的把应用内资源分享到他的社交圈里,减少用户频繁进行输入账号登录的操作,把其他平台的用户转化为应用内用户的一种做法。
主要是逻辑方面的区别,第三方登录其实就是让用户享受一键登录的快感,而不需要记住任何账号和密码,这种用户体验也是为了满足用户容易遗忘在不同平台所使用的账号和密码,避免了繁杂吃力不讨好的注册流程,也更方便把社交平台的用户转化为自身应用内用户。账号绑定前面已经说了,就是让用户更方便得进行分享。
这里说明一点,账号绑定跟第三方登录都是要走授权流程的,所以说它们背后的逻辑是一样的,只是它在我们的应用逻辑不一样。
两种情况:
1.账号未登录,不显示绑定状态
2.账号登录,显示账号绑定状态
用户可以选择使用第三方登录,登录成功之后,就已经绑定了其中一个平台。
我们可以看到,QQ账号已经绑定成功了。这里有一点忘记说了,怎样才算绑定账号成功?
无论是第三方登录还是账号绑定都有一个生成账号的过程,而这个过程是需要跟服务端进行交互的,通过我们授权获取到的第三方平台的数据来生成我们应用内的账号,如果生成成功,那就意味着绑定成功了。
有绑定的状态,自然也有取消绑定的状态:
这里的取消绑定只是简单改变应用内的一个状态罢了,并不会跟我们的服务端交互,也不会影响我们的账号登录的状态。
说了这么多,也没看见代码,你们会不会打我,尼玛,打人不打脸,打脸伤自尊,好坏好坏的。
下面贴使用友盟做的账号绑定:
// 整个平台的Controller,负责管理整个SDK的配置、操作等处理 private UMSocialService mController = UMServiceFactory .getUMSocialService(AppConstants.DESCRIPTOR);
/** * 配置分享平台参数 */ private void configPlatforms() { // 添加新浪sso授权 mController.getConfig().setSsoHandler(new SinaSsoHandler()); // mController.getConfig().setSinaCallbackUrl("http://sns.whalecloud.com/sina2/callback"); // 添加QQ、QZone平台 addQQPlatform(); } private void addQQPlatform() { String appId = AppConstants.QQZONE_APPID; String appKey = AppConstants.QQZONE_APPKEY; // 添加QQ支持, 并且设置QQ分享内容的target url UMQQSsoHandler qqSsoHandler = new UMQQSsoHandler(SettingActivity.this, appId, appKey); qqSsoHandler.setTargetUrl("http://www.umeng.com"); qqSsoHandler.addToSocialSDK(); }
在Onclick方法中处理点击事件:
登录方法
/** * 授权。如果授权成功,则获取用户信息 * * @param platform */ private void login(final SHARE_MEDIA platform) { mController.doOauthVerify(SettingActivity.this, platform, new UMAuthListener() { @Override public void onStart(SHARE_MEDIA platform) { LogUtils.logi(TAG, "onStart------" + Thread.currentThread().getId()); ToastUtils.showShort(SettingActivity.this, getString(R.string.oauth_begin)); } @Override public void onError(SocializeException e, SHARE_MEDIA platform) { LogUtils.logi(TAG, "onError------" + Thread.currentThread().getId()); ToastUtils.showShort(SettingActivity.this, getString(R.string.oauth_fail)); } @Override public void onComplete(Bundle value, SHARE_MEDIA platform) { LogUtils.logi(TAG, "onComplete------" + Thread.currentThread().getId()); // 获取uid String uid = value.getString("uid"); if (value != null && !TextUtils.isEmpty(uid)) { // uid不为空,获取用户信息 getUserInfo(platform); } else { ToastUtils.showShort(SettingActivity.this, getString(R.string.oauth_fail)); } } @Override public void onCancel(SHARE_MEDIA platform) { LogUtils.logi(TAG, "onCancel------" + Thread.currentThread().getId()); ToastUtils.showShort(SettingActivity.this, getString(R.string.oauth_cancle)); } }); }
/** * 获取用户信息 * * @param platform */ private void getUserInfo(final SHARE_MEDIA platform) { mController.getPlatformInfo(SettingActivity.this, platform, new UMDataListener() { @Override public void onStart() { // 开始获取 showProgressDialog(); } @Override public void onComplete(int status, Map<String, Object> info) { LogUtils.logi("third login", info.toString()); String sns_id = ""; String sns_avatar = ""; String sns_loginname = ""; if (info != null) { String sns = ""; if (platform == SHARE_MEDIA.SINA) { // 新浪微博 sns = "sina"; sns_id = info.get("uid").toString(); sns_avatar = info.get("profile_image_url") .toString(); sns_loginname = info.get("screen_name") .toString(); } else if (platform == SHARE_MEDIA.QQ) { // QQ sns = "qq"; sns_id = info.get("uid").toString(); sns_avatar = info.get("profile_image_url") .toString(); sns_loginname = info.get("screen_name") .toString(); } else if (platform == SHARE_MEDIA.WEIXIN) { // 微信 sns = "wechat"; sns_id = info.get("openid").toString(); sns_avatar = info.get("headimgurl").toString(); sns_loginname = info.get("nickname").toString(); } else if (platform == SHARE_MEDIA.DOUBAN) { // 豆瓣 sns = "douban"; sns_id = info.get("uid").toString(); sns_avatar = info.get("profile_image_url") .toString(); sns_loginname = info.get("screen_name") .toString(); } LogUtils.loge("weixin", sns + "," + sns_id + "," + sns_loginname); HttpRequestHelper.getInstance().getUserBySns( SettingActivity.this, sns, sns_id, sns_avatar, sns_loginname, new GetUserBySnsResponse(platform, sns, sns_id, sns_avatar, sns_loginname)); } } }); }
解除绑定方法
/** * 注销本次登陆 * * @param platform */ private void logout(final SHARE_MEDIA platform) { mController.deleteOauth(SettingActivity.this, platform, new SocializeClientListener() { @Override public void onStart() { } @Override public void onComplete(int status, SocializeEntity entity) { String showText = "解除" + platform.toString() + "平台授权成功"; if (status != StatusCode.ST_CODE_SUCCESSED) { showText = "解除" + platform.toString() + "平台授权失败[" + status + "]"; } else { if (platform == SHARE_MEDIA.SINA) { sinaBindingText .setText(getString(R.string.setting_unbind)); StorageUtils.setShareValue( SettingActivity.this, StorageUtils.KEY_SINA_BINDING, false); } else if (platform == SHARE_MEDIA.QQ) { qqBindingText .setText(getString(R.string.setting_unbind)); StorageUtils.setShareValue( SettingActivity.this, StorageUtils.KEY_QQ_BINDING, false); } } Toast.makeText(SettingActivity.this, showText, Toast.LENGTH_SHORT).show(); } }); }
/** * 显示取消绑定对话框 */ private void showCancleBindingDialog(final SHARE_MEDIA platform) { final ExitDialog exitDialog = new ExitDialog(SettingActivity.this); exitDialog.setExitText(getString(R.string.tip_cancle_binding)); exitDialog.setItemClickListener(new ExitDialog.ItemClickListener() { @Override public void onItemClick(View view, int index) { exitDialog.dismiss(); if (index == 0) { logout(platform); } } }); if (!exitDialog.isShowing() && !isFinishing()) { exitDialog.show(); } }