Подтвердить что ты не робот

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

Я работаю над Android-приложением, которое использует AccountManager для хранения учетных записей и учетных данных. Одна из проблем, с которыми я столкнулась, заключается в том, что даже если я передаю кучу значений String в пакет AccountManager addAccountExplicitly.

Я проверил, чтобы пакет был не пуст и что он содержит значения перед добавлением учетной записи. И в большинстве случаев это так, но каждый раз я получаю null, когда я запрашиваю эти значения.

Значения null возвращаются чаще, когда я только что удалил учетную запись и снова добавил ее.

Я выполняю свой запрос внутри метода 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);

Некоторые другие темы

AccountManager am = AccountManager.get(mContext);
final string value2 = am.getUserData(mAccount, k2);

if (TextUtils.isEmpty(value2)) {
    Log.d("WTF", "value is empty");
}
4b9b3361

Ответ 1

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

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

Это может вызвать проблемы.

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

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

Ответ 2

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

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

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

Обновление:. Тем временем мы нашли подходящее обходное решение, см. fooobar.com/questions/402946/...

Ответ 3

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