Сохраните несколько учетных записей в AccountManager и включите SyncAdapter

Я столкнулся со следующим сценарием. Мое приложение использует AccountManager для хранения учетных данных пользователей. Можно войти в более чем одну учетную запись одновременно, подобно тому, как это делает твиттер (вы можете перейти в свой профиль и переключиться на другую зарегистрированную учетную запись). Одна из зарегистрированных учетных записей считается активной одновременно.

Пока не знаю, способ, которым я использовал, чтобы определить, какая учетная запись в настоящее время используется пользователем, состоит в том, чтобы сохранить имя текущей учетной записи в 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 больше небезопасно получать доступ к настройкам из разных процессов. Это означает, что если я сохраню в prefs currentLoggedAccount, а затем запущу адаптер синхронизации, он может не получить сохраненный pref, потому что он выполняется в другом процессе.

Как бы вы справились с этим сценарием?


person juanmeanwhile    schedule 06.03.2017    source источник


Ответы (1)


Я также столкнулся с этой же проблемой. Я сделал обходной путь, используя свою локальную БД. Поскольку я использую Realm в своем приложении, я создал таблицу, которая действует как SharedPreference, я храню их как пару ключ-значение. А затем извлек значение, потому что, как вы сказали из API 21, больше нельзя получить доступ к настройкам из разных процессов.

person Abir Hasan    schedule 17.04.2017
comment
Спасибо за ответ Абир. Это будет работать, но все еще кажется мне излишним. Создание таблицы SQL только для хранения одной строки информации заставляет меня думать, что должно быть что-то еще, что я упускаю. - person juanmeanwhile; 27.04.2017