Android特色开发之账户管理

Android特色开发之账户管理

账户管理

Android2.0中加入了一个新的包android.accounts,该包主要包括了集中式的账户管理API,用以安全地存储和访问认证的令牌和密码,比如,我们的手机存在多个账户,每个账户下面都有不同的信息,甚至每个账户都可以与不同的服务器之间进行数据同步(例如,手机账户中的联系人可以是一个Gmail账户中的通讯录,可联网进行同步更新)。下面首先来看看android.accounts包提供了哪些功能,如表9-3所示。
9-3 android.accounts包的功能描述

光看这些介绍,也许会难以理解,下面我们结合一个示例程序来学习android.accounts包中各功能的使用。该示例实现了账户添加功能,可以添加多个账户来集中管理,程序运行界面如图9-27所示,点击新建账户按钮后,就可以添加账户的相关信息,如图9-28所示。程序的具体实现请参见本书所附代码:第9\Examples_09_08
该示例中一共新建了4个账户,因此在退出程序、点击新建联系人时,会出现如图9-29所示的界面来提示用户选择在哪一个账户中创建联系人,这样使得每个账户独立隔开,又统一管理,非常方便。

9-29 新建联系人

由于在该示例中对用户账户信息进行了操作,因此首先要确保在AndroidManifest.xml文件中对操作权限进行声明,以及确定API等级为5,代码如下:

<uses-sdk android:minSdkVersion="5"/> 

<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/></uses-permission> 

<uses-permission android:name="android.permission.ACCOUNT_MANAGER"></uses-permission> 

<uses-permission android:name="android.permission.GET_ACCOUNTS"></uses-permission> 

<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"></uses-permission> 

该示例的UI界面布局设计很简单,大家可以参考本书第4章的内容。首先来看一下如图9-27所示的Activity类的实现,我们需要通过AccountManager类的get方法来取得AccountManager对象,代码如下:

//取得AccountManager对象  

AccountManager _am = AccountManager.get(this); 

AccountManager中提供了很多方法来供我们管理这些账户,常用方法如表9-4所示。
9-4 AccountManager中的常用方法

通过这些方法就可以很轻松地操作这些账户数据,比如,将指定类型的账户信息全部列出来,代码如下:

/* 显示出所有账户 */ 

private void listAccounts() 

10 

11 /* 得到指定类型的账户 */ 

12 Account[] accounts = _am.getAccountsByType(getString(R.string.ACCOUNT_TYPE)); 

13 _accountList.setText("账户列表:"); 

14 for (Account account : accounts) 

15 

16 _accountList.setText(_accountList.getText().toString() + '\n' + 

17 account.name + " - " + account.type); 

18 

19 

下面我们重点来学习如何将账户信息添加到账户管理器中。首先,需要实现一个AccountAuthenticatorActivity类来供用户输入账户信息,即AbstractAccountAuthenticator的一个Activity,如代码清单9-15所示。
代码清单9-15 9\Examples_09_08\src\com\yarin\android\Examples_09_08\auth\SleepyAccount- AuthenticatorActivity.java

20 public class SleepyAccountAuthenticatorActivity extends AccountAuthenticatorActivity 

21 

22 protected void onCreate(Bundle icicle) 

23 

24 super.onCreate(icicle); 

25 setContentView(R.layout.new_account); 

26 final Button done = (Button) findViewById(R.id.new_account_done); 

27 final EditText server = (EditText) findViewById(R.id.new_account_server); 

28 final EditText username = (EditText) findViewById(R.id.new_account_username); 

29 final EditText password = (EditText) findViewById(R.id.new_account_password); 

30 final Activity self = this; 

31 done.setOnClickListener(new OnClickListener() { 

32 public void onClick(View v) 

33 

34 //Account--指定账户名和账户类型  

35 Account account=new Account(username.getText(). 

36 toString(), getString(R.string.ACCOUNT_TYPE)); 

37 //服务器数据  

38 Bundle userdata = new Bundle(); 

39 userdata.putString("SERVER", server.getText().toString()); 

40 //取得AccountManager  

41 AccountManager am = AccountManager.get(self); 

42 //添加一个账户  

43 if (am.addAccountExplicitly(account, password. 

44 getText().toString(), userdata)) 

45 

46 Bundle result = new Bundle(); 

47 result.putString(AccountManager.KEY_ACCOUNT_NAME, username.getText().toString()); 

48 result.putString(AccountManager.KEY_ACCOUNT_TYPE,getString(R.string.ACCOUNT_TYPE)); 

49 setAccountAuthenticatorResult(result); 

50 

51 finish(); 

52 

53 }); 

54 

55 

在上述代码清单中,我们先通过账户名及其类型构建一个Account对象,然后将服务器数据通过Bundle方式加入进来,最后通过AccountManageraddAccountExplicitly方法向账户管理器中添加一个账户信息。
接下来需要添加一个账户服务(Service)和一个验证器(AbstractAccountAuthenticator)。
首先,构建一个authenticator.xml,如代码清单9-16所示。
代码清单9-16 9\Examples_09_08\res\xml\ authenticator.xml

56 <?xml version="1.0" encoding="utf-8"?> 

57 <account-authenticator xmlns:android="http://schemas.android.com/apk/res/android" 

58 android:accountType="com.yarin.AccountType" 

59 android:icon="@drawable/icon" 

60 android:smallIcon="@drawable/icon" 

61 android:label="@string/ACCOUNT_LABEL" 

62 android:accountPreferences="@xml/account_preferences" 

63 /> 

然后,在AndroidManifest.xml文件中开启一个账户管理服务,加入如下代码:

64 <service android:name="SleepyAccountsService"> 

65 <intent-filter> 

66 <action android:name="android.accounts.AccountAuthenticator" ></action> 

67 </intent-filter> 

68 <meta-data 

69 android:name="android.accounts.AccountAuthenticator" 

70 android:resource="@xml/authenticator"> 

71 </meta-data> 

72 </service> 

账户服务类的实现很简单,就是在intent.getAction()的动作为android.accounts. AccountManager. ACTION_AUTHENTICATOR_INTENT时,通过AccountAuthenticatorgetIBinder方法返回一个IBinder,如代码清单9-17所示。
代码清单9-17 9\Examples_09_08\src\com\yarin\android\Examples_09_08\ SleepyAccounts-Service.java

73 public class SleepyAccountsService extends Service 

74 

75 private SleepyAccountAuthenticator _saa; 

76 public IBinder onBind(Intent intent) 

77 

78 IBinder ret = null; 

79 if (intent.getAction().equals(android.accounts.AccountManager. 

80 ACTION_AUTHENTICATOR_INTENT)) 

81 ret = getSleepyAuthenticator().getIBinder(); 

82 return ret; 

83 

84 private SleepyAccountAuthenticator getSleepyAuthenticator() 

85 

86 if (_saa == null) 

87 _saa = new SleepyAccountAuthenticator(this); 

88 return _saa; 

89 

90 

最后,最重要的是AbstractAccountAuthenticator类的实现,因为在添加、操作账户信息时会通过AbstractAccountAuthenticator实现异步调用。下面是实现的addAccount方法,如代码清单9-18所示。
代码清单9-18 addAccount方法

91 /* 添加账户 */ 

92 public Bundle addAccount(AccountAuthenticatorResponse response, String 

93 accountType, String authTokenType, String[] requiredFeatures, Bundle 

94 options)throws NetworkErrorException 

95 

96 Log.d(_tag, accountType + " - " + authTokenType); 

97 Bundle ret = new Bundle(); 

98 Intent intent=new Intent(_context,SleepyAccountAuthenticatorActivity.class); 

99 intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); 

100 ret.putParcelable(AccountManager.KEY_INTENT, intent); 

101 return ret; 

102 

有关账户管理的内容,可能比较难以理解,建议大家一定要结合本节的示例程序进行学习,同时可以参考Android 2.0 SDK文档。

9.6 小结

本章内容之间的联系不是很紧密,都是一些Android中的特色功能,也正是这些功能吸引了不少开发者和用户。这些特色功能主要包括:Android中传感器的使用、语音识别技术、Google Map APIAndroid中的使用和出色的桌面组件开发,最后学习了Android中账户管理功能的简单实现。这些功能在日常生活中运用得也比较广泛,比如GPS导航、路径规划等,希望大家着重理解本章的内容,开发出具有创意的应用。

本文出自 yarin's blog” 博客,请务必保留此出处http://yarin.blog.51cto.com/1130898/479032

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值