需求

对于一个应用来说,帐号管理真是一件麻烦事,所以通过OAuth之类的使用第三方帐号登录是常见的做法。关于这个实现,在Web端有很多现成的解决方案。我之前发过的《RESTful客户端库:RestClient 》也实现了一些(当时提供了饭否、foursquare和google,现在又增加了twitter)。

那么在移动端要怎么做?

Android系统内置了Google帐号(不要跟我谈被阉过的国行版,我们要放眼国际不是么,而且以此类推同样应该可以实现用别的帐号登录),如果能直接用这个登录岂不是方便?

当然,Google提供了这样的功能。

基本流程

整个登录流程大体是这样:

* 应用在登录界面上显示当前手机中已经登录的所有Google帐号(可能不止一个)
* 用户在界面上选择一个帐号
* 程序向系统请求这个帐号验证(附带参数说明需要用这个帐号干什么,比如登录的话只需要取得用户的基本信息)
* Android在界面上弹出提示(显示什么应用请求什么帐号的什么权限)
* 用户选择同意
* Android向Google服务器提交请求
* Google服务器通过验证后返回一个token
* Android将token返回给应用程序
* 应用程序用这个Token登录应用服务端
* 应用服务端用这个token向Google服务器验证(调用取得用户基本信息的API)
* 成功登录

看上去很复杂,但大部分都是标准操作或是系统内置,对于用户来说很简单:

* 登录应用时选择一个帐号
* 确认
* 等待登录成功

根本不需要输入帐号密码什么的。

功能实现

Android SDK里提供了AccountManager用于实现这一功能。

首先要取得当前手机里已登录的所有Google帐号:

private Account[] mAccounts;// ...@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mAccounts = AccountManager.get(this.getActivity()).getAccountsByType("com.google");for (Account a: mAccounts) {// a.name is account name}// ...}

说明:上面是以登录页面为一个fragment为例的,所以用了 this.getAcitivity() ,如果登录页面为一个activity,这里用this即可。"com.google"表示只取Google帐号,过滤掉其它帐号。

然后把取得的mAccounts列表显示到界面上,比如用一个ListView,这个视个人爱好,就不具体作代码举例了。

接下来,在用户点击一个帐号以后,需要依次启动两个异步任务:一个用于取得Google的token,一个用这个token登录应用后端。

在启动异步任务之前,在ListView的 onItemClick 事件里取得用户选择的帐号名,然后根据帐号名取得Account对象:

Account a = getAccountByName(name);AccountManagerFuture<bundle> amf = AccountManager.get(mActivity).getAuthToken(a,"oauth2:https://www.googleapis.com/auth/userinfo.email",null, mActivity, null, null);

说明:getAccountByName就是个循环,根据name从mAccounts里找到匹配的Account对象。mActivity为当前的Activity,如果是在Fragment里,记得用this.getActivity。

需 要注意的是其中的scope参数,就是例子中的这个"oauth2:https://www.googleapis.com/auth /userinfo.email"。表示用oauth2验证,权限为读取用户基本信息中的email地址信息,更多资料参见 Google API 文档(注意,不是Android开发文档)。

之后启动第一个异步任务:

@Override
protected String doInBackground(Object... params) {try {return mFuture.getResult(30, TimeUnit.SECONDS).getString("authtoken");} catch (OperationCanceledException e) {// ...} catch (AuthenticatorException e) {// ...} catch (IOException e) {// ...}return null;
}

说明:AsyncTask的其它部分省略,其中mFuture就是上面取得的AccountManagerFuture<bundle>对象。返回的结果是一个Bundle,所以要调用getString方法取得authtoken。

因 为future.getResult方法是Android系统通过网络向Google服务器请求验证,其间Android还会向用户弹出提示请求的内容, 需要用户确认。所以这个方法的执行时间会比较长,如果不放到异步任务里执行的话,会把界面阻塞住,而且SDK对此也有限制(不放异步任务会报错)。这里只 是举例,所以设置了30秒的超时,实际应该设置得更长一些,给用户留点判断时间,甚至可以不带参数,无限时等待。

取得token以后的事情就是移动应用与应用后端之间的事情。通常就是一个REST请求把token提交给后端,由后端去验证(并取得用户登录身份)。

后端的实现可以用我之前那个RestClient库去调用Google API,取得用户的登录email,然后处理用户的登录操作。具体实现就是一般的第三方登录方式实现,这里略过不提。

使用Google帐号登录Android应用相关推荐

  1. 为什么Google音乐不能用Google帐号登录?

    先放个问题在这里,等我知道了再来回答.顺便测试一下从Windows Live Writer发博文.

  2. 可能是其他人在试图访问您的 Google 帐号。为了安全起见,您暂时无法登录。 请稍后重试,或使用其他设备登录。

    可能是其他人在试图访问您的 Google 帐号.为了安全起见,您暂时无法登录. 请稍后重试,或使用其他设备登录. 解决方法三个步骤: 1.下载网易邮箱大师客户端.(QQ邮箱客户端也行)登录gmail邮 ...

  3. 如何在Android手机上退出Google帐号

    在S6下的操作方式: 进入Settings->Accounts->Google, 点击一下你的帐号之后会进入到Sync Settings下,这里点击More就会出现Remove accou ...

  4. 此 Google 帐号尚未与设备关联。要安装应用,请先访问设备上的 Play 商店应用。 了解详情(已解决)

    当你在谷歌Play商店想要下载一些手机应用时,经常会有跳提示: 此 Google 帐号尚未与设备关联.要安装应用,请先访问设备上的 Play 商店应用. 了解详情 此时需要打开你的Chrome浏览器, ...

  5. 此 Google 帐号尚未与设备关联。要安装应用,请先访问设备上的 Play 商店应用

    此 Google 帐号尚未与设备关联.要安装应用,请先访问设备上的 Play 商店应用 解决方案: 我在google浏览器上下载个apk文件却遇到了这种情况 怎么办呢? 1.下载并安装chrome浏览 ...

  6. 使用unity完成华为游戏的初始化和华为帐号登录

    背景介绍: 前面写得几个帖子已经详细介绍了: Unity Editor安装和Apk打包 手把手教您快速运行Unity提供的华为游戏demo. 至此,unity提供给华为的demo已经可以正常运行起来. ...

  7. qwidget多个窗口同步_【好人BUG】本机多组控制 一台电脑使用一个帐号登录多个(省钱) !...

    一台电脑,可以用同一个好人帐号登录N个,达到控制一台电脑分组控制多个窗口同步操作. 这个好人BUG,你是否知道!给你省钱-->--> --------------------------- ...

  8. java session 数量_java中使用session监听实现同帐号登录限制、登录人数限制

    本文主要介绍了java中使用session监听实现同帐号登录限制.登录人数限制,具体代码如下: 问题域: 1.同帐号登录:若此帐号已登录,不可再次登录(与QQ模式相反). 2.登录人数限制,超过.已达 ...

  9. 大家狂欢吧,我的Google帐号悲剧了

    大家狂欢吧,我的Google帐号悲剧了 今早开始,鄙人在Google Code上突然被强行杯具,出现如下图. 最无奈的是询问Google Code管理组后得到回复如下. 然后管理员就睡觉去了|||-- ...

最新文章

  1. python六角形的绘制
  2. One order error message log and storage
  3. pyhton学习,day1作业,用户名密码登录模块
  4. 软考信息系统项目管理师_信息系统综合测试与管理---软考高级之信息系统项目管理师027
  5. 加强网站安全、重构公司的门户网站项目(C# VS2003)
  6. epoll nio区别_什么是BIO,NIO与AIO
  7. vue系列之vue cli 3引入ts
  8. smtp协议与pop3协议
  9. php网站后台不显示验证码,网站后台验证码不显示原因
  10. 【应用笔记】APM32F4xx_ADC应用笔记
  11. java之get/set方法的作用:灵活、安全
  12. 无人机这个创业方向靠谱吗?值得投资吗?
  13. matlab利民的逻辑运算符,matlab逻辑运算符
  14. Raspberry Pi Pico ADC配合MQ2测量可燃气体浓度
  15. jieba分词怎么操作_jieba 分词的使用和原理浅析
  16. 关于计算机等级考试的资源网,计算机等级考试计算机网络题库
  17. [整理]PCB阻抗控制
  18. 企微红包裂变该怎么做?
  19. linux server设置开机自动连接WIFI
  20. Android 上关于设备唯一标识的调研

热门文章

  1. 醛肽:Ac-AAVALLPAVLLALLAPIETD-CHO|886462-83-5
  2. 寻 找 苍 凉 [转贴]
  3. trex做网卡性能测试方法
  4. MLlib spark 垃圾邮件分类
  5. 关于研究生论文的一些些指点(导师第一次讲话记录)
  6. Unity 【Wheel Collider】实现游戏中的车具控制
  7. SQL不走索引的情况
  8. Unity Shader Fresnel 菲涅尔反射
  9. 高数基础_函数的奇偶性
  10. 停车位共享小程序开发制作