每个人都喜欢自己的名字被他人记住,同样地,如果想让您的应用程序更人性化,为不同的用户提供不同的用户体验,以及自定义配置,那么就需要记录用户的个人信息。当用户从旧的设备更新到新的设备,或者从一台设备切换到另一台设备上面(例如用户拥有一台平板电脑和手机,并且经常在两者之间切换),您的应用应当可以准确识别出用户,那么如何才能区分用户和记录用户信息,并且准确地鉴别用户身份,本文的目的就是要解决上面提到的问题。
对于大多数应用来说, 账户管理器 AccountManager 就足够了,利用其提供的API,只要获得用户的权限许可,就可以很容易地取得当前设备上已经存储的用户账户名信息。
集成用户帐号的管理,可以让您的应用程序完成如下的功能:
- 表格的自动填写(如用户的 Email 地址信息)
- 记录和获得与用户身份绑定的ID,而不仅仅是设备的ID
账户管理器 AccountManager 是否适合您的应用程序
应用程序通常使用如下的3种技术来进行账户的管理:
- 要求用户填写账户名称
- 识别当前应用程序运行的设备信息,记录设备的ID
- 通过系统提供的 AccountManager 来获取当前设备已记录的用户信息
方案(1)的缺点如下:首先,每次启动应用程序之前都需要输入用户名的信息,程序显得不太友好,吸引力不足,其次,没有好的办法来保证用户名的唯一性。
方案(2)较方案(1)来说为用户减轻了一点负担,但是它很难保证用户的准确性。因为您的应用程序仅仅是与具体的设备绑定在了一起,想象一下,用户从一台旧设备升级到了新设备,在新设备上面运行应用的时候,您的应用程序就不再记得该用户了。
方案(3)是首选的解决方案,通过利用系统提供的 AccountManager,您可以获取当前设备上面已经存储的用户身份信息,不论用户拥有多少台设备,只要用户登录了该设备,那么您就可以准确地识别该用户。对于您应用程序的设计来说,也仅仅是加入几个多余的 UI 界面而已。
设计不同的账户类型
Android 设备可以存储不同类型的账户信息,当您通过 AccountManager 来进行账户查询的时候,通常需要利用账户类型来进行过滤,账户类型(account type)是一个字符串,要求唯一性,用来和系统中已存储的其他类型的账户进行区分,例如,Google 的账户类型是 "com.google",Twitter 的账户类型是 "com.twitter.android.auth.login",当然可以利用自己的个人域名来进行区分,例如 "com.zhourunsheng.com"。
申请获得用户账户信息的权限 GET_ACCOUNT
如果要读取当前设备上面的账户信息,您的应用需要 GET_ACCOUNTS 权限,在 manifest 文件的 <uses-permission> tag 中添加
示例代码
<manifest ... > <uses-permission android:name="android.permission.GET_ACCOUNTS" /> ... </manifest>
用户帐号查询
一旦确定了账户的类型,您就可以通过 AccountManager 来进行查询了。首先通过调用 AccountManager.get() 来获得一个 AccountManager 实例对象,然后调用它的成员函数 getAccountsByType() ,通过传递账户类型的参数,就能得到该账户类型下面的所有用户的一个用户列表。
示例代码
AccountManager am = AccountManager.get(this); // "this" references the current Context Account[] accounts = am.getAccountsByType("com.google");
函数调用返回一个包含所有帐号 Account 的数组。
假如查询结果多于一个用户,那么在您的应用中应当弹出一个对话框来让用户选择其中一个账户为该应用的当前账户。
利用用户帐号个性化您的应用程序
用户帐号 Account 中包含了用户名信息,Google 的账户存储的是用户的 Email 地址,您可以使用这些信息来扩展您的应用,比如:
- 表格自动填写建议和自动填写,这样用户就不需要手动输入账户信息了。
- 作为您应用程序在线数据库的一个键值,以此来保存和区分不同用户的自定义配置信息。
是否需要账户的验证机制来处理私有数据
通过用户帐号 Account 可以很方便的区分用户,但是 Account 本身并不提供任何数据的保护机制,如果您的应用中需要用户访问在线数据库的私有数据,那么需要另一种访问控制方式: authentication (验证),这会在下一节课中讲到,通过编写一个自定义的验证机制来访问您应用程序的在线私有数据库。
参考文摘:
http://developer.android.com/training/id-auth/identify.html
test