新聞中心
到目前為止我們已經(jīng)討論了如何訪問(wèn)Google API,它使用由谷歌定義的賬戶和用戶。如果你有自己的線上服務(wù),而它卻沒(méi)有谷歌賬戶或用戶,那么你將如何做?其實(shí)可以相對(duì)直接地在用戶設(shè)備上安裝一個(gè)新 的賬戶類型。這節(jié)課解釋如何創(chuàng)建一個(gè)和內(nèi)建賬戶一樣能工作的自定義帳戶類型。

創(chuàng)新互聯(lián)建站公司2013年成立,先為江口等服務(wù)建站,江口等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為江口企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
實(shí)現(xiàn)你的自定義帳戶代碼
首先你需要一種獲取用戶憑據(jù)的方法。這有可能像一個(gè)詢問(wèn)用戶名和密碼的對(duì)話框一樣簡(jiǎn)單?;蛘咚赡苁且粋€(gè)更奇特的程序,比如一次性密碼或生物識(shí)別掃描。無(wú)論哪種方法,你有責(zé)任去實(shí)現(xiàn)這些需求:
- 收集用戶憑據(jù)
- 在服務(wù)器上驗(yàn)證這些憑據(jù)
- 在設(shè)備商保存憑據(jù)
通常情況下,以上三個(gè)需求都可以在一個(gè)activity中處理。我們稱之為“驗(yàn)證者activity”。
因?yàn)樗麄兌夹枰唾~戶管理* ( AccountManager_') 系統(tǒng)進(jìn)行相互作用,因此驗(yàn)證者activity就會(huì)有一些一般activity所沒(méi)有的特定需求。為了方便地把事情做好,Android框架提供了一個(gè)基礎(chǔ)類, AccountAuthenticatorActivity * ,通過(guò)它你可以專注去創(chuàng)建你自己的自定義身份驗(yàn)證。
至于如何處理驗(yàn)證者activity的前兩個(gè)需求,即憑證收集和驗(yàn)證,這完全取決于你。(如果假定只有一種方法來(lái)實(shí)現(xiàn)它,那么很顯然我們就沒(méi)必要去做“自定義”賬戶類型。)第三個(gè)需求有一個(gè)典型的,而且頗為簡(jiǎn)單的實(shí)現(xiàn)方式:
- final Account account = new Account(mUsername, your_account_type);
- mAccountManager.addAccountExplicitly(account, mPassword, null);
對(duì)安全更注意一些
理解* AccountManager *不是一種加密服務(wù)或者密鑰鏈這件事非常重要。它僅僅按照你傳遞的內(nèi)容用'''明文'''來(lái)存儲(chǔ)。在大部分設(shè)備上,這不是一個(gè)典型的顧慮,因?yàn)樵O(shè)備把他們存儲(chǔ)在只有根用戶才能訪問(wèn)的數(shù)據(jù)庫(kù)中。但是在已經(jīng)被Root過(guò)的設(shè)備上,通過(guò)'_adb連接可以讓任何人讀取憑據(jù)信息。
因此,你不能直接傳遞用戶的真實(shí)密碼給* android.os.Bundle) AccountManager.addAccountExplicitly()* 。 相反,你應(yīng)該存儲(chǔ)加密的安全令牌來(lái)保障限制攻擊者的使用。如果你的用戶憑證需要保護(hù)一些敏感信息,你應(yīng)該謹(jǐn)慎考慮做出相似的事情。
** 記?。?* 當(dāng)涉及到安全有關(guān)代碼,請(qǐng)按照“流言終結(jié)者(Mythbusters)”規(guī)則:不要在家里嘗試這個(gè)!在執(zhí)行任何自定義代碼之前請(qǐng)一定要咨詢安全專業(yè)人士。
既然安全免責(zé)聲明是不合適的,那么現(xiàn)在是時(shí)候回去工作了。你已經(jīng)理解了自定義帳戶代碼的核心,剩下的就是去實(shí)現(xiàn)它了。
繼承AbstractAccountAuthenticator
為了讓* AccountManager 能夠和你的自定義用戶賬戶代碼一起工作,你需要一個(gè)實(shí)現(xiàn)了 AccountManager * 所需要的接口的類。這個(gè)類就是''“驗(yàn)證類”(authenticator class)_。
建立一個(gè)驗(yàn)證類的最簡(jiǎn)單的方法是繼承* AbstractAccountAuthenticator 并且實(shí)現(xiàn)其中的抽象方法。如果你已經(jīng)學(xué)習(xí)了之前的課程, AbstractAccountAuthenticator * 的抽象類方法可能看起來(lái)比較熟悉:他們的功能剛好與你在前一課中調(diào)用的賬戶信息和授權(quán)令牌的方法相反。
正確地實(shí)現(xiàn)一個(gè)驗(yàn)證類要求一連串單獨(dú)的代碼段。首先,* AbstractAccountAuthenticator * 有七個(gè)你必須重寫(xiě)的抽象方法。其次,你需要在你的application menifes(將在下一節(jié)講到)中為'''"android.accounts.AccountAuthenticator"'''添加一個(gè)* intent filter * 。最后,你必須提供兩個(gè)XML資源,其中包括你的自定義帳戶類型的名稱和系統(tǒng)將在這個(gè)類型賬戶后面顯示的圖標(biāo)。
你可以查找一個(gè)“一對(duì)一向?qū)А眮?lái)實(shí)現(xiàn)一個(gè)成功的驗(yàn)證類和在* AbstractAccountAuthenticator * 文檔中的XML文件。同樣在SampleSyncAdapter示例程序中有一個(gè)簡(jiǎn)單的實(shí)現(xiàn)方法。
如果你已讀過(guò)SampleSyncAdapter的代碼,你就會(huì)發(fā)現(xiàn)有很多個(gè)方法在一個(gè)bundle鐘返回一個(gè)intent。而這個(gè)intent和 將被用于運(yùn)行你的自定義的驗(yàn)證activity的是同一個(gè)intent。如果你的驗(yàn)證activity需要任何特殊的初始化參數(shù),你可以使用* Intent.putExtra()) * 來(lái)將他們添加進(jìn)該intent中。
創(chuàng)建一個(gè)驗(yàn)證服務(wù)
既然你已經(jīng)有了一個(gè)驗(yàn)證類,你需要一個(gè)地方來(lái)讓它運(yùn)行。賬戶驗(yàn)證在多個(gè)應(yīng)用中必須是可用的,并且能夠在后臺(tái)運(yùn)行,所以他們自然需要運(yùn)行在一個(gè)* 服務(wù)Service * 中。我們稱之為驗(yàn)證服務(wù)。
你的驗(yàn)證服務(wù)一定要非常簡(jiǎn)單。它需要做的僅僅是在* onCreate()) 方法中創(chuàng)建一個(gè)你的驗(yàn)證類的實(shí)例,并且調(diào)用 getIBinder()) 和 onBind()) * 方法。* SampleSyncAdapter示例程序 *中有一個(gè)很好的驗(yàn)證服務(wù)的例子。
不要忘記在你的manifest文件中添加一個(gè)* * 標(biāo)簽和一個(gè)AccountAuthenticator intent的intent filter(過(guò)濾器),并且聲明這個(gè)賬戶驗(yàn)證器:
- android:resource="@xml/authenticator" />
發(fā)布你的服務(wù)
你已經(jīng)完成了!系統(tǒng)現(xiàn)在可以在那些大牌賬戶類型比如"Google"和"Corporate"當(dāng)中認(rèn)出你的賬戶類型。你可以使用* Accounts & Sync(賬戶與同步)* 設(shè)置頁(yè)面來(lái)添加一個(gè)賬戶,而且那些需要你自定義類型的賬戶的軟件能夠像任何其他賬戶類型一樣美劇和驗(yàn)證你的賬戶類型。
當(dāng)然,這些全都是假設(shè)你的賬戶服務(wù)被正確的安裝在設(shè)備上的。如果只有一個(gè)程序需要訪問(wèn)這個(gè)服務(wù),那么就這就會(huì)很簡(jiǎn)單,只需要在應(yīng)用中捆綁這個(gè)服務(wù)就 可以了。但是如果你想讓你的賬戶服務(wù)被用于不止一個(gè)應(yīng)用,那么事情就會(huì)變得棘手了。因?yàn)槟悴幌氚逊?wù)綁定到每一個(gè)的應(yīng)用上,并且在設(shè)備上占用大量的空間來(lái) 保存多個(gè)副本。
一種解決方法把這個(gè)服務(wù)換成一個(gè)小的,有特殊目的的APK。當(dāng)一個(gè)應(yīng)用想要使用你的自定義帳戶類型,它可以檢查這個(gè)設(shè)備看你的自定義帳戶類型有沒(méi)有 運(yùn)行。如果沒(méi)有,它能夠帶領(lǐng)用戶到Google Play下載這個(gè)服務(wù)。這剛開(kāi)始看起來(lái)似乎是一個(gè)大麻煩,但是同讓每一個(gè)應(yīng)用程序在使用自定義賬戶類型時(shí)重復(fù)輸入憑據(jù)的方案對(duì)比來(lái)看,這很顯然要簡(jiǎn)單得多。
網(wǎng)站標(biāo)題:Android開(kāi)發(fā):創(chuàng)建自定義帳戶類型
文章來(lái)源:http://fisionsoft.com.cn/article/cosssjo.html


咨詢
建站咨詢
