【问题标题】:Store several accounts in the AccountManager and include a SyncAdapter在 AccountManager 中存储多个帐户并包含一个 SyncAdapter
【发布时间】:2017-03-06 10:30:39
【问题描述】:

我正面临以下情况。我的应用程序使用 AccountManager 来存储用户凭据。可以同时登录多个帐户,类似于 twitter 所做的(您可以转到您的个人资料并切换到不同的登录帐户)。一次记录的帐户之一被视为处于活动状态。

在知道之前,我用来识别用户当前正在使用哪个帐户的方法是将当前帐户名称存储在 SharedPreferences 中。这样,您可以随时从首选项中检索此名称,在帐户管理器中获取已登录帐户的列表并进行迭代,直到获得正确的帐户对象。像这样的:

String currentAccountName = SharedPreferences.get(mContext).getString(PREF_CURRENT_ACCOUNT, null);
Account[] accounts = AccountManager.get(mContext).getAccountsByType(MY_ACCOUNT_TYPE);
Account loggedAccount;
for (Account account : accounts) {
    if (account.name.equals(currentAccountName)) {
          loggedAccount = account;
          break;
    }
}

//Get the token for this account
String authToken = AccountManager.get(mContext).getToken(account, MY_ACCOUNT_TYPE,...).getResult().get(AccountManager.AUTH_TOKEN);

此外,在运行 SyncAdapter 时,它会从首选项中获取 currentAccountName 以获取令牌并连接到服务器。

问题在于,从 API 21 开始,从不同进程访问首选项不再安全。这意味着,如果我将 currentLoggedAccount 存储到 prefs 中,然后启动 Sync Adapter,它可能无法获取存储的 pref,因为它在不同的进程中执行。

您将如何处理这种情况?

【问题讨论】:

    标签: android authentication android-preferences android-syncadapter accountmanager


    【解决方案1】:

    我也遇到了同样的问题。我使用本地数据库做了一个解决方法。当我在我的应用程序中使用Realm 时,我制作了一个充当SharedPreference 的表,我将它们存储为键值对。然后检索该值,因为正如您在 API 21 中所说,从不同进程访问首选项不再可靠。

    【讨论】:

    • 感谢您回答 Abir。这会起作用,但对我来说仍然感觉有点矫枉过正。创建一个 SQL 表只是为了存储一行信息,这让我觉得肯定还有一些我遗漏的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 2021-08-25
    • 2023-04-06
    相关资源
    最近更新 更多