Вопрос по android – AccountManager getUserData возвращает ноль, несмотря на то, что он установлен
Я работаю над приложением Android, которое используетAccountManager хранить учетные записи & amp; полномочия. Одна проблема, с которой я столкнулся, заключается в том, что, хотя я передаю кучу значений String в AccountManager'saddAccountExplicitly пакет данных.
Я проверил, чтобы убедиться, что пакетnot empty и что этоcontains значения до добавления учетной записи. И в большинстве случаев это так, но время от времени я получаю нулевое значение, когда запрашиваю эти значения.
Нулевые возвращаемые значения более распространены после того, как я просто удалил учетную запись и повторно добавил ее.
Я делаю запрос внутриonAccountsUpdated методOnAccountsUpdateListener реализация, поэтому учетная запись должна быть добавлена и хорошо идти, верно?
Спасибо за любую помощь
AuthenticatorActivity
// in the AuthenticatorActivity
Bundle userData = new Bundle();
userData.put (k1, v1);
userData.put (k2, v2);
userData.put (k3, v3);
userData.put (k4, v4);
userData.put (k1, v1);
Account a = new Account ("acc name", "com.account.type");
AccountManager am = AccountManager.get(this);
OnAccountsUpdateListener listener = new OnAccountsUpdateListener() {
@Override
public void onAccountsUpdated(Account[] accounts) {
Account mine = findAccount(accounts, account); // match account name
notifySignedIn(mine); // tell the world you're signed in
am.removeOnAccountsUpdatedListener(this);
}
};
am.addOnAccountsUpdatedListener(listener, handler, false);
am.addAccountExplicitly(a, "themostsecurepwintheworld", userData);
Some other thread
AccountManager am = AccountManager.get(mContext);
final string value2 = am.getUserData(mAccount, k2);
if (TextUtils.isEmpty(value2)) {
Log.d("WTF", "value is empty");
}
Мне известна одна ошибка в Honeycomb plus, которая может вызвать вашу проблему. Если вы попытаетесь получить getUserData учетной записи до того, как она будет зарегистрирована, все последующие вызовы getUserData вернут null.
Если вы посмотрите на код. AccountManager имеет кэш в памяти, который поддерживается базой данных sqlite. Вызов getUserData заполняет пользовательские данные кэша в памяти, даже если они не зарегистрированы. Если он не зарегистрирован, он интерпретирует это как отсутствие пользовательских данных. Регистрация учетной записи только заполняет базу данных и не делает недействительной хранилище в памяти.
Это может быть причиной вашей проблемы.
Обходной путь должен удалить учетную запись перед вызовом addAccountExplicitly.
Я. эта проблема отстой и является ОГРОМНОЙ ошибкой в AccountManger IMO и позволяет третьим сторонам по сути DOS вашего приложения.
Вы используете устройство HTC с Android 4? Я получил много сообщений об этой проблеме от пользователей моих приложений синхронизации.All из них используется устройство HTC с уровнем SDK 15.
Похоже, ошибка HTC для меня.
Несколько пользователей сообщили, что проблема исчезла после перезагрузки.
Update: Тем временем мы нашли правильный обходной путь, видитеhttps://stackoverflow.com/a/29776224/1558654