2011-03-14 71 views
8

我已經在我的應用程序中集成了android的帳戶管理,我可以從Accounts & Sync設置管理帳戶。處理登錄並記住我的帳戶管理器

我想要有經典的登錄活動,在成功登錄時將用戶轉發到他的家庭活動,並可以選擇記住用戶的密碼。但是,AccountAuthenticatorActivity必須使用憑據和其餘帳戶信息將結果返回到AccountManager,並調用明確的finish()並返回意圖。

我該如何給AccountManager提供所需的信息,而無需finish()我的登錄活動?

+0

那麼您是否最終設法處理登錄並使用AccountManager記住我?因爲它,我一直在努力應對我的應用程序流。只有在設備上沒有帳戶的情況下啓動我的應用時,我纔會觸發AccountAuthenticatorActivity,但我無法設法使「最佳實踐」流程正確無誤。 – CinetiK 2013-08-19 11:33:08

回答

19

AccountManager並不是由交互式應用程序調用,而是由同步適配器調用。 (A偉大的教程是「你贏不過»寫一個Android的同步提供?」 Part 1Part 2它提供了很大的代碼示例,但並不做解釋數據流作爲偉大的工作。)是這樣的:

您開發一個包裝數據庫的ContentProvider。您構建一個SyncAdapter(這是一個後臺服務),以連接到服務器並獲取數據並同步ContentProvider以匹配服務器。然後,您的UI查詢到ContentProvider以顯示提取的數據。例如,如果您想要搜索和緩存結果,還有一些方法可以直接查詢特定信息。關於數據模型的外觀,請參閱Developing RESTful Android Apps瞭解一小時的會話。他們給出了三個架構示例,從「天真」的實現開始,然後發展到適當的SyncAdapter模型。

對於身份驗證本身,SyncAdapter使用AccountManager的方式是獲取身份驗證令牌。這是一個(通常)很大的十六進制值,它作爲HTML標頭的一部分代替用戶名/密碼對傳遞。把它看作一個會話唯一的密鑰。關鍵的證明是驗證的證明,並且它們定期失效。當它們到期時,您重新認證並獲取一個新的。 SyncAdapater向AccountManager請求特定帳戶類型/用戶名組合的身份驗證令牌。 AccountManager與服務器進行身份驗證(如果需要,請求用戶輸入更改後的密碼),並將該令牌返回給SyncAdapter,SyncAdapter將從此時開始使用該密碼。

如果此模型不適合您的應用程序,則需要手動處理應用程序代碼中的登錄/註銷。我知道那種痛苦。

+0

我現在有一個像你提到的設置,內容提供商包裝分貝和使用同步適配器(谷歌IO談話巖!)。我只是試圖重用我的AccountAuthenticatorActivity處理常規登錄。 「你贏了嗎?」教程將AccountManager交互添加到現有的登錄屏幕(雖然他們沒有顯示完整的代碼),所以我猜可能會有使用同一活動的工作。 – mgv 2011-03-16 12:20:42

+0

好吧,對。因此,此處的示例代碼顯示了登錄屏幕,但是與其他帳戶(Google帳戶,Facebook帳戶等)一樣,屏幕會在帳戶和同步控制面板中顯示,而不是在您的應用內顯示。 (嘗試在Android gMail應用程序中找到一個輸入密碼的地方......你不能!只能通過帳戶和同步)。因此,此處的模型是您在A&S控制頁面上輸入密碼,然後您的應用程序會詢問AccountAuthenticator如何進入服務器。 Authenticator爲您的SyncAdapater提供authToken,SyncAdapter爲服務器提供authToken以進行身份​​驗證。 – jcwenger 2011-03-16 12:31:18

+0

嗯,更確切地說,您可以添加一個帳戶,但它通過調用意圖啓動帳戶和同步「創建帳戶」活動來實現,而不是通過直接調用AccountAuthenticator上的任何東西...然後一旦帳戶創建完成堅持等待SyncAdapter來做它的骯髒的工作,就像你的情況一樣。 – jcwenger 2011-03-16 12:33:22

11

@jcwenger這不完全正確。您也可以在交互式應用程序中使用AccountManager。例如,您可以使用AccountManageraddAccountExplicitly()方法添加帳戶,而無需調用帳戶管理器界面。

關於「你贏了嗎?」文章中您可以清楚地看到客戶經理是從應用程序自己的Activity中調用的。如果應用程序有其自己的帳戶管理界面,這很有用。

1

我的「經典流」使用AccountManager的版本:

我用我的AuthenticatorActivity無論是在那裏它通過使用正常的情況下。帳戶&同步設置,但我也將其打開以供依賴相同帳戶的應用程序使用。 我有一個單獨的apk與Authenticator實現和其他應用程序(單獨apks)依賴這些帳戶。

例處理:

  • 正常情況:用戶增加/通過進行認證。帳戶&同步(根據Android示例項目)

  • 處理來自外部應用程序的身份驗證請求: 如何?我在Authenticator應用程序的Manifest中提供了一個intent過濾器,以便其他應用程序可以通過實例化AuthenticatorActivity。 startActivityForResult(它們必須包含一個指示他們是誰的應用程序包)。在AuthenticatorActivity中,我檢測到這種情況,並且在身份驗證過程結束時不要調用setAccountAuthenticatorResult,因爲我保留它用於上面的正常情況。用戶輸入他們的憑證並按下登錄:AccountManger會被檢查一個匹配的賬戶,如果匹配,我會保留該賬戶的用戶名作爲調用應用程序包的活動用戶。然後我通過返回一個意圖到調用應用程序。表示成功的setResult,用戶名和帳戶類型。在帳戶不存在的情況下,我會經歷正常情況下的過程,即調用addAccountExplicitly,然後設置活動用戶,然後像調用setResult並完成之前一樣。

希望這可以幫助別人。