现在的位置: 首页 > 移动开发> 正文
Android 用户管理专题之创建自定义帐户类型
2012年01月05日 移动开发 暂无评论 ⁄ 被围观 4,167+

到目前为止,我们学习和讨论的都是利用Google的账户来访问Google的在线服务,假如您有自己的在线服务,却没有Google类型的账户,这个时候该怎么办呢?本节课的目的就是来解决上面提到的问题,为自己的在线服务创建一个自定义的账户类型,并且像设备的内置账户一样的方式工作。

创建自定义账户

要想创建一个新的自定义类型的账户,首先要做的工作是生成用户凭据(credentials),该过程可以很简单,比如要求用户输入账户名和密码,也可以复杂一些,要求用户设置一次性密码或启用生物特征扫描(如视网膜扫描,指纹识别)。不论是哪种方式,这是您必须要做的工作。
具体包括:

  1. 收集用户凭据
  2. 将用户凭据同在线服务进行身份认证
  3. 存储认证过的用户凭据

通常这三个步骤可以在一个 activity 中完成,我们可以将这个activity 称之为认证 activity (authenticator activity)。

因为 authenticator activity 需要访问系统的账户管理器 AccountManager,比普通的 activity 有更多的权限要求,Android framework 为了方便应用程序的开发,特意提供了一个基类 AccountAuthenticatorActivity,您可以通过继承该类来实现自定义的账户验证器。

前两个步骤(收集凭据和服务验证)如何实现完全取决于您应用程序的设计,最后一个步骤(存储凭据)是一个标准的实现,代码如下:

 final Account account = new Account(mUsername, your_account_type);
 mAccountManager.addAccountExplicitly(account, mPassword, null);

智能安全

需要特别注意的是: AccountManager 本身并不对用户凭据(credentials)做任何的加密处理,以纯文本的方式进行存储,在大部分的设备上,这都没有问题,因为 credentials 保存在只有 root 权限才能读取的数据库中,但是对于已经 root 解锁的设备来说,就有可能出现问题,此时任何人可通过 adb 工具来读取系统中存储的 credentials 信息。

考虑到这些因素,您就不应该简单的把用户的实际密码通过 AccountManager.addAccountExplicitly() 来保存,相反,应该存入一个更加安全的加密的安全令牌来抵御安全攻击。如果您的用户凭据用来保护非常有价值的数据,您在设计的时候应该慎重考虑。

Remember: When it comes to security code, follow the "Mythbusters" rule: don't try this at home! Consult a security professional before implementing any custom account code.

OK,到此为止安全问题就暂告一段落了,验证器的代码框架我们也已经熟悉了,接下来的工作就是把整套流程衔接起来。

编写验证器(继承扩展AbstractAccountAuthenticator)

为了要让系统的账户管理器 AccountManager 来管理您自定义的账户类型,那么您必须要实现 AccountManager 用来管理帐号的一个接口,这个接口就是验证器 authenticator class

创建一个自定义验证器的最简单的方法莫过于继承系统提供的验证器虚类 AbstractAccountAuthenticator,然后实现里面的抽象方法 (abstract methods)。如果您已经接触过前面的课程,那么这些抽象方法应该是很熟悉了,他们就是获取账户信息和授权令牌后的回调方法。

实现一个自定义的验证器需要下面几部分的代码,首先您需要实现 AbstractAccountAuthenticator 中存在的7个抽象方法,其次您需要在 manifest 文件中加入 intent filter for "android.accounts.AccountAuthenticator"(下一节课程会讲解),最后,您还需要提供两个 XML 资源文件,除了其他的事项,需要提供自定义账户的类型名称和图标,系统显示账户的时候需要将这两项信息显示在账户的旁边。

您可以参照该 AbstractAccountAuthenticator 指导文件一步一步实现一个自定义的验证器,这边还有 Demo 示例 (SampleSyncAdapter sample app)可供参考。

阅读Demo 示例 (SampleSyncAdapter sampleapp)的过程中,您可能发现很多方法都在 bundle 中返回一个 intent,这个 intent 同时也用来启动您的自定义验证器 (custom authenticator activity)。如果您需要特殊的初始化参数,那么可以通过调用方法 Intent.putExtra()进行添加。

创建验证器服务(authenticator service.)

前面的代码中您已经实现了自定义的验证器类,现在需要一个服务来启动验证过程。因为该验证器能够被多个程序使用,并且后台运行,那么最佳的选择方案莫过于创建一个服务(Service),我们称之为验证器服务。

验证器服务的实现可以很简单,在服务的onCreate() 方法中创建一个验证器实例,在onBind()方法中调用getIBinder() ,Demo 示例(SampleSyncAdapter sample app)中可以找到怎么样定义一个验证器服务。

最后要做的工作就是在 manifest 文件中的 <service> tag 中添加 intent filter 和声明验证器。

示例代码:

   <service ...>
   <intent-filter>
       <action android:name="android.accounts.AccountAuthenticator" />
   </intent-filter>
   <meta-data android:name="android.accounts.AccountAuthenticator"
        android:resource="@xml/authenticator" />
   </service>

发布您的服务

到此为止,工作算是顺利完成了!现在系统的账户管理器可以正常识别您的自定义账户类型了,同系统已有的其他账户类型相似,比如 "Google" 和 "Corporate"。 您可以在系统的 Accounts &Sync 设定界面添加账户, 当用户选择账户类型的时候,您新添加的账户类型就可以正常选择了。

当然,所有这些的前提是您的验证器服务已经正确地安装到设备上。假如只有一个APP会使用此服务,肯定不会出现什么问题,APP和该服务绑定即可。但是如果有多个应用需要使用您的验证器服务,情况会变得稍微复杂些,您可不愿意每一个APP都绑定一个此服务的副本,这回占用很多的设备空间。

一种解决方法是将您的验证器服务做成一个独立的小的APK安装程序,当一个APP想要使用您的自定义的账户类型时,先检查一下设备的账户管理器,看是否支持,如果不支持的话,可以引导用户从 Android Market 上面下载和安装。这看起来似乎比较麻烦,但是比较起每次使用APP的时候都需要重复输入账户凭证来说还是好多了。

参考文摘:
http://developer.android.com/training/id-auth/custom_auth.html

给我留言

留言无头像?


×
腾讯微博