到目前為止,我們已討論過如何存取 Google API,這些 API 會使用 Google 定義的帳戶和使用者。但是,如果您擁有自己的線上服務,則不會有 Google 帳戶或使用者,您該怎麼做?因為在使用者的裝置上 安裝新帳戶類型相對簡單明瞭。本課程將說明如何建立與內建帳戶相同的自訂帳戶類型。
導入自訂帳戶程式碼
首先,您必須透過取得使用者憑證的方式。這可以像要求輸入名稱和密碼的對話方塊一樣簡單。也可能是較為特殊的程序,例如動態密碼或生物特徵辨識掃描。無論採用哪一種方式,您都有責任實作程式碼以達到下列目標:
- 收集使用者的憑證
- 向伺服器驗證憑證
- 將憑證儲存在裝置上
一般來說,上述三項要求皆可由單一活動處理。我們將這個活動稱為驗證器活動
由於驗證者需要與 AccountManager
系統互動,因此驗證器活動有某些要求,一般活動無法滿足這些要求。為了輕鬆找出正確資訊,Android 架構提供基礎類別 AccountAuthenticatorActivity
,您可以擴充這個類別,建立自己的自訂驗證器。
完全由您決定如何滿足驗證器活動的前兩項需求條件,包括收集和驗證憑證。(如果只有一個方法,就不需要「自訂」帳戶類型)。第三個規定是標準 (更簡單的實作) 實作:
Kotlin
Account(username, your_account_type).also { account -> accountManager.addAccountExplicitly(account, password, null) }
Java
final Account account = new Account(username, your_account_type); accountManager.addAccountExplicitly(account, password, null);
謹慎考慮安全性!
請務必瞭解 AccountManager
並非加密服務或金鑰鏈。就像您傳遞帳戶憑證一樣,它會以純文字格式儲存帳戶憑證。在大多數裝置上,這不會特別重要,因為這會存放在只能由 Root 權限存取的資料庫中。但在已解鎖裝置上,具有 adb
存取權的任何人都可以讀取憑證。
請記住,您不應將使用者的實際密碼傳送至 AccountManager.addAccountExplicitly()
。相反地,您應該儲存經加密編譯且只有攻擊者能使用的加密權杖。如果使用者憑證保護有價值的項目,您應審慎考慮執行類似的操作。
注意:輸入安全碼時,請遵守「迷思路人」原則:切勿在家中試用這個函式!在導入任何自訂帳戶程式碼前,請先諮詢安全專業人員。
既然安全性免責事項已經停用,該是時候回歸工作了。 您已實作自訂帳戶程式碼的肉品,剩下的部分是程式碼。
擴充抽象帳戶驗證器
為了讓 AccountManager
能夠與您的自訂帳戶程式碼搭配使用,您需要有實作 AccountManager
預期介面的類別。此類別是驗證器類別。
如要建立驗證器類別,最簡單的方法是擴充 AbstractAccountAuthenticator
,並實作其抽象方法。如果您已看過先前的課程,AbstractAccountAuthenticator
的抽象方法應該很熟悉:與您在先前課程呼叫的方法相反,以取得帳戶資訊和授權權杖。
正確實作驗證器類別需要一些獨立的程式碼。首先,AbstractAccountAuthenticator
有七個必須覆寫的抽象方法。接著,您必須在應用程式資訊清單中新增 "android.accounts.AccountAuthenticator"
的意圖篩選器 (如下一節所示)。最後,您必須提供兩項 XML 資源,定義自訂帳戶類型的名稱,以及系統在這類帳戶旁邊顯示的圖示。
您可以在 AbstractAccountAuthenticator
說明文件中參閱逐步指南,瞭解如何實作成功的驗證器類別和 XML 檔案。
如果驗證器活動需要任何特殊的初始化參數,您可以使用 Intent.putExtra()
將這些參數附加至意圖。
建立驗證器服務
現在,您已擁有驗證器類別,需要讓其上線。帳戶驗證器必須可供多個應用程式使用,並在背景中運作,因此自然需要在 Service
中執行。我們將稱之為驗證器服務
驗證器服務非常簡單。你只需在 onCreate()
中建立驗證器類別的執行個體,然後在 onBind()
中呼叫 getIBinder()
即可。
別忘了在資訊清單檔案中加入 <service>
標記,並新增 AccountAuthenticator 意圖的意圖篩選器,並宣告帳戶驗證器:
<service ...> <intent-filter> <action android:name="android.accounts.AccountAuthenticator" /> </intent-filter> <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/authenticator" /> </service>
發布服務
大功告成!系統現在可辨識您的帳戶類型,以及所有大名稱帳戶類型,例如「Google」和「公司」。您可以透過「帳戶與同步處理」設定頁面新增帳戶,而要求自訂類型帳戶的應用程式也能進行列舉和驗證,就像使用任何其他帳戶類型一樣。
當然,執行上述操作時,都是假設您已確實在裝置上安裝帳戶服務。如果只有一個應用程式可以存取該服務,那就不是件大事,只需在應用程式中隨附該服務即可。不過,如果您想讓多個應用程式使用帳戶服務,情況會更加輕鬆。您不希望將服務與所有應用程式組合在一起,且不希望讓多個應用程式重複佔用使用者裝置空間。
其中一種解決方法,是將服務放入一個特殊用途的小型 APK。當應用程式想要使用您的自訂帳戶類型時,可以檢查裝置,確認是否可使用您的自訂帳戶服務。如果沒有,應用程式可以引導使用者前往 Google Play 下載服務。乍看之下似乎是個大問題,但相較於重新輸入每個使用自訂帳戶的應用程式,這個簡單的做法很容易更新。