Вопрос по android – AccountManager getUserData возвращает ноль, несмотря на то, что он установлен

14

Я работаю над приложением 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");
}
Слишком много кода для копирования + pase, но я отредактирую вопрос с помощью некоторого базового кода. Существует много параллелизма и потоков, но все инициируется черезonAccountsUpdatedListener. copolii
Некоторый код, пожалуйста. kichik

Ваш Ответ

3   ответа
0

У меня была похожая проблема, но моя проблема оказалась в попытке сохранить длинное значение userData вместо String. Преобразование моего длинного в строку для хранения и повторное его преобразование в длинное при извлечении сделало мой трюк.

8

Мне известна одна ошибка в Honeycomb plus, которая может вызвать вашу проблему. Если вы попытаетесь получить getUserData учетной записи до того, как она будет зарегистрирована, все последующие вызовы getUserData вернут null.

Если вы посмотрите на код. AccountManager имеет кэш в памяти, который поддерживается базой данных sqlite. Вызов getUserData заполняет пользовательские данные кэша в памяти, даже если они не зарегистрированы. Если он не зарегистрирован, он интерпретирует это как отсутствие пользовательских данных. Регистрация учетной записи только заполняет базу данных и не делает недействительной хранилище в памяти.

Это может быть причиной вашей проблемы.

Обходной путь должен удалить учетную запись перед вызовом addAccountExplicitly.

Я. эта проблема отстой и является ОГРОМНОЙ ошибкой в AccountManger IMO и позволяет третьим сторонам по сути DOS вашего приложения.

Error: User Rate Limit Exceeded copolii
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
3

Вы используете устройство HTC с Android 4? Я получил много сообщений об этой проблеме от пользователей моих приложений синхронизации.All из них используется устройство HTC с уровнем SDK 15.

Похоже, ошибка HTC для меня.

Несколько пользователей сообщили, что проблема исчезла после перезагрузки.

Update: Тем временем мы нашли правильный обходной путь, видитеhttps://stackoverflow.com/a/29776224/1558654

Error: User Rate Limit Exceededstackoverflow.com/questions/28691847/…
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceedednoError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded copolii
Error: User Rate Limit Exceeded

Похожие вопросы