【发布时间】: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