2013-12-17 82 views
1

我想使用Android的內置AccountManager來處理我們的原生Android應用程序的帳戶。但是,我們有一個特殊的需求。如何讓AccountManager爲每個用戶名處理多個帳戶?

看起來,Android的帳戶概念是名稱(即[email protected])和類型(即com.example)的組合。名稱是您登錄的用戶名。類型與您的應用程序或公司相關聯。

但是,我們的REST後端允許單個用戶擁有多個賬戶,並且每個賬戶必須通過與一個用戶名和一個賬號(除了類型)的組合相連的自己唯一的哈希來訪問。

我已經擁有AccountAuthenticator,AuthenticationService和AccountAuthenticatorActivity,可以爲單個用戶使用單個帳號和單個存儲的散列。有什麼方法可以實現我的AccountAuthenticator來處理具有相同用戶名下的多個賬戶的用戶,每個賬戶都需要一個哈希值?是否可以附加一個分隔符到用戶名並在每次使用時將它分成用戶名和帳號?

如果我找不到解決這個問題的方法,那麼在AbstractAccountAuthenticator.getAuthToken期間應該如何優雅地回退?將散列設置爲特殊標誌值併爲該用戶使用傳統登錄方法是否有意義?或者是太多的黑客?

感謝您的幫助!

回答

0

我結束了使用at符號(@)作爲分隔符序列化數據到用戶名。我選擇了at標誌,因爲它是電子郵件地址中唯一隻能使用一次的受限字符。

這裏是getAuthToken我AccountAuthenticator的代碼被稱爲只有當我需要獲得新令牌用戶和帳戶ID:

/* 
    * 
    * The login params need to handle users with multiple accounts under the same username. 
    * 
    * Since Android's AccountManager does not allow multiple accounts per username, I had 
    * to create a hack which joins and splits the username on a delimiter to serialize the 
    * data and retrieve the account number for users with multiple accounts. I chose the @ 
    * sign as a delimiter because e-mail addresses have VERY few invalid characters in 
    * the account name part of the address. 
    * 
    * If the user has multiple accounts, we need to create each one in AccountManager. 
    * 
    * */ 

    String[] accountParts = account.name.split("@"); 
    numParts = accountParts.length; 
    if (numParts<2) { 
     Log.wtf(Config.TAG, "Username split produced too few parts. WTF."); 
     return null; 
    } 
    String email = accountParts[0] + "@" + accountParts[1]; 

    if (numParts==3) { 
     String account_id = accountParts[2]; 
    } else if (numParts>3) { 
     Log.wtf(Config.TAG, "Username split produced too many parts. WTF."); 
     return null; 
    } 
0

如果你不介意散列是公開的,你當然可以使帳戶名稱username|hash(或你想要的任何分隔符) - 系統不關心你用於帳戶名稱,除非它唯一地定義了一個用戶。

+0

這是非常相似,我的思路,不同的是我會存儲每個用戶的帳號而不是散列。 此外,我決定使用@作爲分隔符來序列化信息,因爲它是唯一不能出現在電子郵件地址的用戶名部分中的分隔符。例如:MazerRackham @ example.com @ 123456。我正在採取措施,當我得到很好的實施時,我可能會回答自己的問題。 – colintheshots

相關問題