大家在平時使用Android手機的時候,都會發現有些應用(例如qq, 微信,淘寶)為自己創建了賬號系統,並且能夠在設置頁面看到他,可是當自己希望為自己的軟件寫一個賬號系統的時候總是不知從何入手,現在我們就從頭開始,一步一步打造屬於自己應用的賬號系統。
在進行設備賬戶管理的時候,我們會通過一個AccountManager 類獲取系統的賬戶管理類,獲取的方法如下: - AccountManager mAccountManager = (AccountManager) getSystemService(ACCOUNT_SERVICE);
複製代碼
或者 - AccountManager accountManager = AccountManager.get(context);
複製代碼
接下來我們需要通過AccountManager 對像對賬號系統進行操作。
1.獲取賬戶信息 首先我們來查看一下如何獲取用戶已有的賬戶信息,如果你希望讀取系統當前的賬戶信息,那麼你首先需要在manifest 文件中申明一個讀取賬戶的權限,如下:
- <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
複製代碼
(1)獲取所有賬戶信息 如果你希望獲取到當前設備所有的賬戶信息,你可以使用: - accountManager.getAccounts();
複製代碼
(2)獲取特定的賬戶信息 如果你只希望獲取自己或者特定的賬戶信息,你就應該使用: - accountManager.getAccountsByType("com.kifile");
複製代碼
後面的參數是你自己定義的賬戶類型,怎麼設置我會在接下來的文章中寫出來。 然後,我們就可以通過上面獲取到的工具類,讀取到手機上的賬戶信息了,這裡我寫了一個ListView 的Adapter 用於展示當前系統中的賬號信息: - public class AccountAdapter extends BaseAdapter {
- private Account[] mAccounts;
- public AccountAdapter(Account[] accounts) {
- this.mAccounts = accounts;
- }
- @Override
- public int getCount() {
- return mAccounts != null ? mAccounts.length : 0;
- }
- @Override
- public Object getItem(int position) {
- return mAccounts[position];
- }
- @Override
- public long getItemId(int position) {
- return 0;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- TextView tv = new TextView(getBaseContext());
- tv.setText(mAccounts[position].name + " " + mAccounts[position].type);
- return tv;
- }
- }
複製代碼
獲取當前所有系統賬戶信息以及設置ListView 的Adapter 的方法如下:
- mListView.setAdapter(new AccountAdapter(mAccountManager.getAccounts()));
複製代碼
顯示效果如下:
同你當前設備進行對比,你就會發現我們已經將當前所有的賬戶信息顯示了出來,同樣地如果你只希望顯示部分的賬戶信息,你就可以通過getAccountByType 獲取對應的賬戶列表。
2.建立自己的賬號服務 通過上面的部分,我們已經知道瞭如何獲取Android 本身現有的賬號信息,現在我們就開始著手建立屬於自己的賬號系統吧。 你需要知道的是,如果你希望建立自己的賬號系統,那麼你得在manifest 文件中聲明一個關於賬號的Service,如下 - <service
- android:name="com.kifile.account.app.account.AccountService"
- android:enabled="true"
- android:exported="true">
- <intent-filter>
- <action android:name="android.accounts.AccountAuthenticator"/>
- </intent-filter>
- <meta-data
- android:name="android.accounts.AccountAuthenticator"
- android:resource="@xml/authenticator"/>
- </service>
複製代碼
在上面的代碼中,我們通過設置intent-filter 告知系統,我們當前應用中有一個賬號服務,至於具體的賬號信息則放在meta-data 中的android:resource 文件中提供, 該文件為authenticator.xml ,放置路徑為res/xml,內容如下:
- <?xml version="1.0" encoding="utf-8"?>
- <account-authenticator
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:accountType="com.kifile"
- android:icon="@drawable/ic_launcher"
- android:smallIcon="@drawable/ic_launcher"
- android:label="@string/app_name"/>
複製代碼
在這裡,我們就可以向系統提供相關的賬戶信息,用於在Android Setting 目錄下顯示對應的賬號信息。例如這裡,我們就定義了當前的賬戶類型為"com.kifile",在賬戶系統中顯示的標籤為@string/app_name 對應的String 對象,顯示的icon 為ic_launcher。
Ok,到了這裡,我們已經向系統聲明了一個賬戶相關的服務,現在讓我們來具體實現他。 Android 為我們提供了一個叫做AbstractAccountAuthenticator 的抽像類,也是通過它來實現: - public static class Authenticator extends AbstractAccountAuthenticator {
- public Authenticator(Context context) {
- super(context);
- }
- @Override
- public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
- return null;
- }
- @Override
- public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options) throws NetworkErrorException {
- return null;
- }
- @Override
- public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) throws NetworkErrorException {
- return null;
- }
- @Override
- public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
- return null;
- }
- @Override
- public String getAuthTokenLabel(String authTokenType) {
- return null;
- }
- @Override
- public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
- return null;
- }
- @Override
- public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) throws NetworkErrorException {
- return null;
- }
- }
複製代碼
從上面的代碼中,我們可以看出,Android需要從我們自定義的Service中獲取一個 AbstractAccountAuthenticator對象,然後再調用對像中的方法來實現賬號系統的具體操作,每一個方法的意義,我們在本文中就不具體探討了,如果你有興趣,可以去看看API文檔。
當我們創建好了一個AbstractAccountAuthenticator 類後,我們需要從Service 中取得這個類的對象,代碼如下: - private Authenticator authenticator;
- @Override
- public void onCreate() {
- super.onCreate();
- authenticator = new Authenticator(this);
- }
- @Override
- public IBinder onBind(Intent intent) {
- return authenticator.getIBinder();
- }
複製代碼
AccountService 類在onCreate 的時候創建一個Authenticator 對象,然後再bindService 的時候,將Authenticator 的 IBinder 傳遞回去,以供調用。
當你完成上面的步驟之後,你就會發現,在你的設置頁麵點擊添加賬戶時就會出現你自定義的賬戶了,如下: 3.添加賬戶 雖然通過上面的步驟,我們已經能夠在添加賬戶的界面看到屬於我們自己的賬戶類別了,但是你會發現當你點擊它們的時候,沒有任何作用,那麼我們應該怎麼在設備上完成添加賬戶的操作呢?
(1)加入添加賬戶的權限 添加賬戶也需要對應的權限,你應該在manifest 文件中加入 - <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
複製代碼
(2)重寫Authenticator 的addAccount 方法 當用戶在添加賬戶頁面選擇賬戶進行添加或者調用accountManager.addAccount 的時候,系統會默認調用AbstractAccountAuthenticator 中的addAccount 方法,因此你需要重寫addAccount 方法,直接添加默認賬戶,或者跳轉到某個頁面,讓用戶填寫用戶信息,然後添加賬戶。
(3)使用addAccountExplicitly 直接添加賬戶 如果你希望直接添加賬戶信息,你可以使用以下方法: - Account account = new Account("Kifile,,,,12","com.kifile");
- accountManager.addAccountExplicitly(account,password,userdata);
複製代碼
使用之後,你就會發現在設置頁面出現你所建立的賬戶,點擊進去,會發現賬戶名什麼的也已經成功設置:
本文暫時就到這裡了,通過本文,你可以初步了解到Android 的賬戶信息的建立流程,希望對大家有所幫助。
|