Android记录22-关于开发中账号绑定的逻辑处理

Android记录22-关于开发中账号绑定的逻辑处理

转载请注明:IT_xiao小巫

博客地址:http://blog.csdn.net/wwj_748

前言

本篇博客要跟大家分享的是开发中我们常常遇到的账号绑定的功能开发,我们先来思考几个问题:

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();
		}
	}

到这里就是整个实现逻辑,请不要叫我给demo,多动手,用点脑,相信你很快就可以把这个功能实现的。

时间: 2024-08-01 07:47:00

Android记录22-关于开发中账号绑定的逻辑处理的相关文章

在Android(Java)开发中如何实现类似C语言中的中断程序

在Android开发过程中,有时候会遇到这样的情况,在一个线程中,执行A操作,B操作需要等A操作结束后才进行,因此需要wait,在java中可以如下代码实现 Handler mBlueHandler = new Handler(Looper.getMainLooper()); Task task = new Task(); mBlueHandler.post(task); while (!task.finish) { synchronized (task) { try { task.wait()

git使用记录九:开发中临时加塞了紧急任务怎么处理

开发中临时加塞了紧急任务怎么处理 隐藏工作区域 git stash git status 查询隐藏的列表 git stash list 处理完bug,提交之后,再恢复隐藏的工作区域 git stash pop 原文地址:https://www.cnblogs.com/soaeon/p/10909300.html

Android Builder模式在开发中的应用

最近在学习图片加载框架Glide的时候,被他精简的写法震惊了.一句话,就可以搞定. Glide.with(mContext) .load(url) .centerCrop() .placeholder(R.drawable.default_img) .crossFade() .into(mImageView); 同时在年初的时候,学习RXJava的时候,用链式编程很优雅. Observable .just( "1" , "2" ) .subscribeOn(Sche

Android 集成sina sdk 开发中,不能使用web授权,停止运行解决办法

在使用新浪SDK的时候,就出现了这个问题,一直以为是代码问题,但核对新浪SDK的DEMO后,发现代码流程都对呀 在Manifest.xml中注入SDK的WebBrowser <activity             android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"             android:configChanges="keyboardHidden|orientation"

Windows开发中一些常用的辅助工具

经常有人问如何快速的定位和解决问题,很多时候答案就是借助工具, 记录个人Windows开发中个人常用的一些辅助工具. (1) Spy++ 相信windows开发中应该没人不知道这个工具, 我们常用这个工具查看窗口层次,跟踪窗口消息. (2) WinSpy 一个窗口相关的小工具,非常有用,可以帮我们快速查看和修改窗口属性.(这个工具是开源的, 拿来学习挺不错的) (3) Process Explorer 非常有用的工具,类似任务管理器,但是比任务管理器强大的多. 可以让我们查看查看每个进程的详细信

Linux以及Android开发中的小技巧和长繁命令记录收集

不断更新收集中.... 2014071743 ssh以nx_guest的身份登录到172.24.221.137,然后在172.24.221.137与172.24.61.252的8080端口建立网络连接,同时创建端口为5678的本地代理服务 ssh -C -f -N -o 'TCPKeepAlive=yes' -L 5678:172.24.61.252:8080 [email protected] 反编译android下的二进制程序 ./prebuilts/gcc/linux-x86/arm/ar

Android开发中使用七牛云存储进行图片上传下载

Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储原理,上面这幅图片是官方给出的原理图,表述当然比较清晰了.可以看出,要进行图片上传的话可以分为五大步: 1. 客户端用户登录到APP的账号系统里面: 2. 客户端上传文件之前,需要向业务服务器申请七牛的上传凭证,这个凭证由业务服务器使用七牛提供的服务端SDK生成: 3. 客户端使用七牛提供的客户端S

关于Android开发中Shape的总结

今天修改Android的界面布局修改了正在一天,各种控件的样式和标准都有一定的规范.对于样式的设计我也是研究了一天,为了防止遗忘,特在此记录一下: 在Android开发中,为响应美化应用中控件的效果,使用Shape定义图形效果,可以解决图片过多的问题. 1 <!-- 圆角 --> 2 <corners 3 android:radius="9dp"<!-- 设置四个角半径的值 --> 4 android:topLeftRadius="2dp&quo

android开发中应该注意的问题

1. Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效. 2. 数据库表段字段常量和SQL逻辑分离,更清晰. 3. 全局变量放全局类中,模块私有放自己的管理类中,不要相信庞大的管理的东西会带来什么好处,可能是一场灾难. 4. 如果数据没有必要加载,私有模块数据务必延迟初始化,谨记为用户节省内存,总不会有坏处. 5. 异常抛出,集中到合适的位置处理,不要抛出来异常立即捕获,搞的到处是catch. 6. 地址