如何让AccountManager为每个用户名处理多个帐户?

时间:2013-12-17 22:25:48

标签: java android rest login accountmanager

我想使用Android的内置AccountManager来处理原生Android应用的帐户。但是,我们有一个特殊的需要。

Android的帐户概念似乎是名称(即MazerRackham@example.com)和类型(即com.example)的组合。名称是您登录的用户名。类型与您的应用程序或公司相关联。

但是,我们的REST后端允许单个用户拥有多个帐户,并且每个帐户必须通过其自己的唯一散列访问,该散列与一个用户名和一个帐号的组合相关(除了类型)。

我已经将AccountAuthenticator,AuthenticationService和AccountAuthenticatorActivity用于具有单个帐号和单个存储哈希的单个用户。有没有什么方法可以实现我的AccountAuthenticator来处理具有相同用户名的多个帐户的用户,每个帐户都需要哈希?是否可以在用户名中附加分隔符,并在每次使用时将其分为用户名和帐号?

如果我无法找到解决这个问题的方法,那么我应该如何在AbstractAccountAuthenticator.getAuthToken期间优雅地退回?将哈希值设置为特殊标志值并为该用户使用旧式登录方法是否有意义?或者这太糟糕了?

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

如果您不介意哈希是公开的,您当然可以创建帐户名username|hash(或您想要的任何分隔符) - 系统不关心您使用的帐户名称,除非它唯一定义用户。

答案 1 :(得分:0)

我最后使用at符号(@)作为分隔符将数据序列化为用户名。我选择了at符号,因为它是电子邮件地址中唯一一个只能使用一次的限制字符。

以下是我的AccountAuthenticator中来自getAuthToken的代码,仅当我需要为该用户和帐户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;
    }