`
MyEyeOfJava
  • 浏览: 1126426 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7af2d6ca-4fe1-3e9a-be85-3f65f7120bd0
测试开发
浏览量:70239
533896eb-dd7b-3cde-b4d3-cc1ce02c1c14
晨记
浏览量:0
社区版块
存档分类
最新评论

[Android]中文API(三)android.account包下的那些类

阅读更多

账户管理

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,代码如下:

  1. <uses-sdk android:minSdkVersion="5"/> 
  2. <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/></uses-permission> 
  3. <uses-permission android:name="android.permission.ACCOUNT_MANAGER"></uses-permission> 
  4. <uses-permission android:name="android.permission.GET_ACCOUNTS"></uses-permission> 
  5. <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"></uses-permission>  

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

  1. //取得AccountManager对象  
  2. AccountManager  _am = AccountManager.get(this);   

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

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

  1. /* 显示出所有账户 */ 
  2. private void listAccounts()  
  3. {  
  4. /* 得到指定类型的账户 */ 
  5. Account[] accounts = _am.getAccountsByType(getString(R.string.ACCOUNT_TYPE));  
  6. _accountList.setText("账户列表:");  
  7. for (Account account : accounts)  
  8. {  
  9.     _accountList.setText(_accountList.getText().toString() + '\n' +   
  10.     account.name + " - " + account.type);  
  11. }  
  12. }  

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

  1. public class SleepyAccountAuthenticatorActivity extends AccountAuthenticatorActivity  
  2. {  
  3. protected void onCreate(Bundle icicle)  
  4. {  
  5.     super.onCreate(icicle);  
  6.     setContentView(R.layout.new_account);  
  7.     final Button done = (Button) findViewById(R.id.new_account_done);  
  8.     final EditText server = (EditText) findViewById(R.id.new_account_server);  
  9.     final EditText username = (EditText) findViewById(R.id.new_account_username);  
  10.     final EditText password = (EditText) findViewById(R.id.new_account_password);  
  11.     final Activity self = this;  
  12.     done.setOnClickListener(new OnClickListener() {  
  13.         public void onClick(View v)  
  14.         {  
  15.             //Account--指定账户名和账户类型  
  16.             Account account=new Account(username.getText().  
  17.             toString(), getString(R.string.ACCOUNT_TYPE));  
  18.             //服务器数据  
  19.             Bundle userdata = new Bundle();   
  20.             userdata.putString("SERVER", server.getText().toString());  
  21.             //取得AccountManager  
  22.             AccountManager am = AccountManager.get(self);  
  23.             //添加一个账户  
  24.             if (am.addAccountExplicitly(account, password.  
  25.             getText().toString(), userdata))  
  26.             {  
  27.                 Bundle result = new Bundle();  
  28.                 result.putString(AccountManager.KEY_ACCOUNT_NAME, username.getText().toString());  
  29.                 result.putString(AccountManager.KEY_ACCOUNT_TYPE,getString(R.string.ACCOUNT_TYPE));  
  30.                 setAccountAuthenticatorResult(result);  
  31.             }  
  32.             finish();  
  33.         }  
  34.     });  
  35. }  
  36. }    

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

  1. <?xml version="1.0" encoding="utf-8"?> 
  2.  <account-authenticator xmlns:android="http://schemas.android.com/apk/res/android" 
  3.  android:accountType="com.yarin.AccountType" 
  4.  android:icon="@drawable/icon" 
  5.  android:smallIcon="@drawable/icon" 
  6.  android:label="@string/ACCOUNT_LABEL" 
  7.  android:accountPreferences="@xml/account_preferences" 
  8.  />  

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

  1. <service android:name="SleepyAccountsService"> 
  2. <intent-filter> 
  3. <action android:name="android.accounts.AccountAuthenticator" ></action> 
  4. </intent-filter> 
  5. <meta-data   
  6. android:name="android.accounts.AccountAuthenticator" 
  7. android:resource="@xml/authenticator"> 
  8. </meta-data> 
  9. </service>   

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

  1. public class SleepyAccountsService extends Service  
  2. {  
  3. private SleepyAccountAuthenticator  _saa;  
  4. public IBinder onBind(Intent intent)  
  5. {  
  6.     IBinder ret = null;  
  7.     if (intent.getAction().equals(android.accounts.AccountManager.  
  8.     ACTION_AUTHENTICATOR_INTENT))  
  9.         ret = getSleepyAuthenticator().getIBinder();  
  10.     return ret;  
  11. }  
  12. private SleepyAccountAuthenticator getSleepyAuthenticator()  
  13. {  
  14.     if (_saa == null)  
  15.         _saa = new SleepyAccountAuthenticator(this);  
  16.     return _saa;  
  17. }  

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

  1. /* 添加账户 */ 
  2. public Bundle addAccount(AccountAuthenticatorResponse response, String   
  3. accountType, String authTokenType, String[] requiredFeatures, Bundle   
  4. options)throws NetworkErrorException  
  5. {  
  6. Log.d(_tag, accountType + " - " + authTokenType);  
  7. Bundle ret = new Bundle();  
  8. Intent intent=new Intent(_context,SleepyAccountAuthenticatorActivity.class);  
  9. intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);  
  10. ret.putParcelable(AccountManager.KEY_INTENT, intent);  
  11. return ret;  

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

9.6  小结

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

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

分享到:
评论

相关推荐

    android各组件详解——Account

    android各组件详解——Account 一.Google帐户API 二.帐户列表 三.添加帐户

    Android代码-有了json-api-mock framework, 再也不用担心后端API还没开发好

    我们将上述内容保存为user.json,然后放在assets目录下的mockdata/account/目录中(这里的account是suite-name,后面会介绍); 接着,创建Client,增加以下配置: MockApiSuite suite = new MockApiSuite("account...

    Android.Development.Patterns.Best.Practices.for.Professional.Developers.0133

    “A must read for all developers that want to begin serious Android development.” —Justin Anderson, Freelance Android Developer “From start to finish, this book contains a variety of great tips ...

    android sdk 自带 实例(samples)

    An application that demonstrates how to query the system contacts provider using the ContactsContract API, as well as insert contacts into a specific account. Home A home screen replacement ...

    Android代码-一个容易使用android sharepreference的库

    A easy way of using Android SharedPreferences. How to use this library Using Gradle compile 'com.cocosw:favor:0.2.0@aar' Using Maven com.cocosw favor 0.2.0 apklib API 1 Define a interface. ...

    Development.apk(Android Dev Tools)

    Android 键盘/Android 系统/API Domes/Certificate Installer(证书安装)/com.android.gestuer.builder()/com.android.sdksetup()/Custom Locale()/Dev Tools(开发工具)/Example Wallpapers(墙纸式样)/HTML查看器/...

    Android代码-gnucash-android

    The application supports Android 4.4 KitKat (API level 10) and above. Features include: An easy-to-use interface. Chart of Accounts: A master account can have a hierarchy of detail accounts ...

    Android代码-黑客新闻客户端

    Material design Hacker News client for Android, uses official HackerNews/API, Dagger for dependency injection and Robolectric for unit testing. Setup Requirements JDK 8 Latest Android SDK tools ...

    Pro Android 4

    chapter on the contacts API is also largely rewritten to take into account the personal profile that paves the way for the Social API. Concepts, code, and tutorials are the essence of this book. Every...

    Android代码-电影票房评估

    This is an Android demo application for displaying the latest box office movies using the RottenTomatoes API. See the RottenTomatoes Networking Tutorial on our cliffnotes for a step-by-step tutorial. ...

    Android代码-Tesco-for-Android

    This is a simple example of using the TESCO API to see their grocery store. You can find details about the API at http://www.techfortesco.com/forum/ and register for the API at ...

    Android Application Security Essentials

    Device administration API 140 Policies 141 DeviceAdminReceiver 142 Protecting data on a device 145 Encryption 146 Backup 147 Secure connection 147 Identity 148 Next steps 149 Device specific decisions...

    sms-verification-android-node:使用Node.js的Android短信验证

    适用于Android的SMS验证-适用于Node.js的服务器此示例项目演示了如何使用Twilio的来验证Android应用程序用户的电话号码。 此应用程序支持Google提供的 。 您还需要具有一个配置为使用这些URL来验证电话号码的Android...

    java开源包8

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    EurekaLog_7.5.0.0_Enterprise

    2)....Added: Support for API key auth in Bugzilla (5.x) 3)....Added: Support for /EL_DisableMemoryFilter command-line option 4)....Added: Asking e-mail when user switches to "details" from MS Classic ...

    java开源包4

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包101

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包10

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    genshinstats:可以使用Mihoyo的API获取您或其他人的Genshin Impact帐户的统计信息的python库

    此项目中使用的api端点尚未公开,但可以免费用于第三方工具,因此,我决定通过为它们进行包装来使其更加公开。 您可以通过 pip安装如何使用导入genshinstats模块,并将cookie设置为login。 要设置cookie,请使用set...

    Account-Ledger-Android-Client

    帐户分类帐Android客户端应用中心掌握 : 开发 : 功能/ Firestore /登录:Github动作Android Apk:Azure开发运营Android Apk: Gitpod Docker映像:特拉维斯CI 掌握 :

Global site tag (gtag.js) - Google Analytics