概述
在android的系統(tǒng)設(shè)置頁,有個(gè)“賬戶”分組,里面有很多的賬戶,很多app都使用了這個(gè)賬戶系統(tǒng),比如“谷歌”,“淘寶”,“微信”,“華為”等。這些都是大公司呢,有沒有可能我們也使用這個(gè),讓我們的軟件的名稱也出現(xiàn)在這里呢,答應(yīng)是肯定的??纯葱Ч麍D:
加上這個(gè),我們的app立馬就高大上了,如何做到呢?
實(shí)現(xiàn)步驟
- 繼承 AbstractAccountAuthenticator 實(shí)現(xiàn) 一個(gè) 自己的 賬戶認(rèn)證器
- 繼承自 service,實(shí)現(xiàn)一個(gè)服務(wù),該服務(wù)使用上一步的 賬戶認(rèn)證器
- 繼承 AccountAuthenticatorActivity ,實(shí)現(xiàn) 自定義的 登錄頁面。
知識(shí)準(zhǔn)備
你需要了解 上面積個(gè)類的知識(shí),和accountManager,我翻譯了這幾個(gè)類的概述,參考我前幾篇文章。
http://www.lxweimin.com/p/82311e1ce09e
http://www.lxweimin.com/p/044c31c3f48d
實(shí)現(xiàn)
如果被系統(tǒng)發(fā)現(xiàn)?
自定義的服務(wù)代碼如下:
<service
android:name=".MyAuthenticatorService"
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>
我們看到,這個(gè)service 指定了過濾器為 android.accounts.AccountAuthenticator,這是個(gè)系統(tǒng)調(diào)用的 action。
自定義 認(rèn)證器 做了什么?
我們需要在定義認(rèn)證器里實(shí)現(xiàn) 它的 addAccount 和 getAuthToken 方法。
addAccount方法: 在api里解釋說,在 添加賬戶時(shí),需要從用戶收集認(rèn)證信息(賬戶名和密碼),需要返回一個(gè)intent,以打開一個(gè)activity,這個(gè)activity就是我們登陸頁了。我們需要在登錄頁里處理登錄的邏輯實(shí)現(xiàn),并使用AccountManager記錄下 登錄成功的用戶信息,并保存在賬戶中心。
getAuthToken方法: 獲得auth Token ,這是一個(gè)授權(quán)標(biāo)記,有些地方翻譯為“令牌”,就是從服務(wù)端返回的字符串,指示了登錄成功。很多系統(tǒng)不在本地(手機(jī))保存真實(shí)的密碼,配合auth token 來顯示一次登錄認(rèn)證,后續(xù)的操作請(qǐng)求都攜帶auth token作為身份令牌。
@Override
public Bundle addAccount(AccountAuthenticatorResponse response,
String accountType, String authTokenType,
String[] requiredFeatures, Bundle options)
throws NetworkErrorException {
// 需要實(shí)現(xiàn)
Log.v(TAG, "addAccount()");
final Intent intent = new Intent(mContext, LoginActivity.class);
intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
final Bundle bundle = new Bundle();
bundle.putParcelable(AccountManager.KEY_INTENT, intent);
return bundle;
}
@Override
public Bundle getAuthToken(AccountAuthenticatorResponse response,
Account account, String authTokenType, Bundle options)
throws NetworkErrorException {
// 需要實(shí)現(xiàn)
return null;
}
演示下載: http://yunpan.cn/cAIvcxDHZjrIS 訪問密碼 d8f7