大家在平時使用 Android 手機(jī)的時候,都會發(fā)現(xiàn)有些應(yīng)用(例如 qq,微信,淘寶)為自己創(chuàng)建了賬號系統(tǒng),并且能夠在設(shè)置頁面看到他,可是當(dāng)自己希望為自己的軟件寫一個賬號系統(tǒng)的時候總是不知從何入手,現(xiàn)在我們就從頭開始,一步一步打造屬于自己應(yīng)用的賬號系統(tǒng)。
在進(jìn)行設(shè)備賬戶管理的時候,我們會通過一個 AccountManager 類獲取系統(tǒng)的賬戶管理類,獲取的方法如下:
1 | AccountManager mAccountManager = (AccountManager) getSystemService(ACCOUNT_SERVICE);
|
或者
1 | AccountManager accountManager = AccountManager.get(context);
|
接下來我們需要通過 AccountManager 對象對賬號系統(tǒng)進(jìn)行操作。
1.獲取賬戶信息
首先我們來查看一下如何獲取用戶已有的賬戶信息,如果你希望讀取系統(tǒng)當(dāng)前的賬戶信息,那么你首先需要在 manifest 文件中申明一個讀取賬戶的權(quán)限,如下:
1 | <uses-permission android:name= "android.permission.GET_ACCOUNTS/" ></uses-permission>
|
(1)獲取所有賬戶信息
如果你希望獲取到當(dāng)前設(shè)備所有的賬戶信息,你可以使用:
1 | accountManager.getAccounts();
|
(2)獲取特定的賬戶信息
如果你只希望獲取自己或者特定的賬戶信息,你就應(yīng)該使用:
1 | accountManager.getAccountsByType(com.kifile);
|
后面的參數(shù)是你自己定義的賬戶類型,怎么設(shè)置我會在接下來的文章中寫出來。
然后,我們就可以通過上面獲取到的工具類,讀取到手機(jī)上的賬戶信息了,這里我寫了一個 ListView 的 Adapter 用于展示當(dāng)前系統(tǒng)中的賬號信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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;
}
}
|
獲取當(dāng)前所有系統(tǒng)賬戶信息以及設(shè)置 ListView 的 Adapter 的方法如下:
1 | mListView.setAdapter( new AccountAdapter(mAccountManager.getAccounts()));
|
顯示效果如下:
同你當(dāng)前設(shè)備進(jìn)行對比,你就會發(fā)現(xiàn)我們已經(jīng)將當(dāng)前所有的賬戶信息顯示了出來,同樣地如果你只希望顯示部分的賬戶信息,你就可以通過 getAccountByType 獲取對應(yīng)的賬戶列表。
2.建立自己的賬號服務(wù)
通過上面的部分,我們已經(jīng)知道了如何獲取 Android 本身現(xiàn)有的賬號信息,現(xiàn)在我們就開始著手建立屬于自己的賬號系統(tǒng)吧。
你需要知道的是,如果你希望建立自己的賬號系統(tǒng),那么你得在 manifest 文件中聲明一個關(guān)于賬號的Service,如下
1 2 3 4 5 6 | <service android:enabled= "true" android:exported= "true" android:name= "com.kifile.account.app.account.AccountService" >
<intent-filter>
</action></intent-filter>
<meta-data android:name= "android.accounts.AccountAuthenticator" android:resource= "@xml/authenticator/" >
</meta-data></service>
|
在上面的代碼中,我們通過設(shè)置 intent-filter 告知系統(tǒng),我們當(dāng)前應(yīng)用中有一個賬號服務(wù),至于具體的賬號信息則放在 meta-data 中的 android:resource 文件中提供, 該文件為authenticator.xml,放置路徑為 res/xml,內(nèi)容如下:
1 2 | <!--?xml version= 1.0 encoding=utf- 8 -->
</account-authenticator>
|
在這里,我們就可以向系統(tǒng)提供相關(guān)的賬戶信息,用于在 Android Setting 目錄下顯示對應(yīng)的賬號信息。例如這里,我們就定義了當(dāng)前的賬戶類型為com.kifile,在賬戶系統(tǒng)中顯示的標(biāo)簽為@string/app_name 對應(yīng)的 String 對象,顯示的 icon 為ic_launcher。
Ok,到了這里,我們已經(jīng)向系統(tǒng)聲明了一個賬戶相關(guān)的服務(wù),現(xiàn)在讓我們來具體實(shí)現(xiàn)他。
Android 為我們提供了一個叫做 AbstractAccountAuthenticator 的抽象類,也是通過它來實(shí)現(xiàn):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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 對象,然后再調(diào)用對象中的方法來實(shí)現(xiàn)賬號系統(tǒng)的具體操作,每一個方法的意義,我們在本文中就不具體探討了,如果你有興趣,可以去看看 API 文檔。
當(dāng)我們創(chuàng)建好了一個AbstractAccountAuthenticator 類后,我們需要從 Service 中取得這個類的對象,代碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 | private Authenticator authenticator;
@Override
public void onCreate() {
super .onCreate();
authenticator = new Authenticator( this );
}
@Override
public IBinder onBind(Intent intent) {
return authenticator.getIBinder();
}
|
AccountService 類在 onCreate 的時候創(chuàng)建一個 Authenticator 對象,然后再 bindService 的時候,將 Authenticator 的 IBinder 傳遞回去,以供調(diào)用。
當(dāng)你完成上面的步驟之后,你就會發(fā)現(xiàn),在你的設(shè)置頁面點(diǎn)擊添加賬戶時就會出現(xiàn)你自定義的賬戶了,如下:
3.添加賬戶
雖然通過上面的步驟,我們已經(jīng)能夠在添加賬戶的界面看到屬于我們自己的賬戶類別了,但是你會發(fā)現(xiàn)當(dāng)你點(diǎn)擊它們的時候,沒有任何作用,那么我們應(yīng)該怎么在設(shè)備上完成添加賬戶的操作呢?
(1)加入添加賬戶的權(quán)限
添加賬戶也需要對應(yīng)的權(quán)限,你應(yīng)該在 manifest 文件中加入
1 | <uses-permission android:name= "android.permission.AUTHENTICATE_ACCOUNTS/" ></uses-permission>
|
(2)重寫 Authenticator 的 addAccount 方法
當(dāng)用戶在添加賬戶頁面選擇賬戶進(jìn)行添加或者調(diào)用accountManager.addAccount 的時候,系統(tǒng)會默認(rèn)調(diào)用 AbstractAccountAuthenticator 中的 addAccount 方法,因此你需要重寫 addAccount 方法,直接添加默認(rèn)賬戶,或者跳轉(zhuǎn)到某個頁面,讓用戶填寫用戶信息,然后添加賬戶。
(3)使用 addAccountExplicitly 直接添加賬戶
如果你希望直接添加賬戶信息,你可以使用以下方法:
1 2 | Account account = new Account(Kifile,,,, 12 ,com.kifile);
accountManager.addAccountExplicitly(account,password,userdata);
|
使用之后,你就會發(fā)現(xiàn)在設(shè)置頁面出現(xiàn)你所建立的賬戶,點(diǎn)擊進(jìn)去,會發(fā)現(xiàn)賬戶名什么的也已經(jīng)成功設(shè)置:
本文暫時就到這里了,通過本文,你可以初步了解到 Android 的賬戶信息的建立流程,希望對大家有所幫助。
|