AccountManager IllegalArgumentException: ключ является нулевым - PullRequest
0 голосов
/ 02 декабря 2011

Хорошо, я получаю IllegalArgumentException в точке, где это не должно быть.

У меня есть пользовательское расширение Account, которое сохраняется с помощью AccountManager:

// Method inside a custom extension of Account
public boolean save(AccountManager manager) {
    removeAll(manager);
    boolean result = manager.addAccountExplicitly(this, null, toBundle());
    manager.setUserData(this, KEY_1, value1);
    manager.setUserData(this, KEY_2, value2);
    manager.setUserData(this, KEY_3, value3);
    return result;
}

Ключи являются постоянными строковыми значениями, но приложение по-прежнему выдает:

java.lang.IllegalArgumentException: key is null

Я должен сказать, что я прикрепляю пользовательские данные только таким образом, потому что использую:

 manager.addAccountExplicitly(this, null, toBundle());

не похоже, чтобы прикрепить значения. Ключи требуют специального имени?

Кто-нибудь имел эту проблему раньше?


Обновление:

Он попадает внутрь manager.setUserData(), который выглядит следующим образом (код Android):

public void setUserData(final Account account, final String key, final String value) {
    if (account == null) throw new IllegalArgumentException("account is null");
    if (key == null) throw new IllegalArgumentException("key is null");
    try {
        mService.setUserData(account, key, value);
    } catch (RemoteException e) {
        // won't ever happen
        throw new RuntimeException(e);
    }
}

Когда я "вхожу" в этот метод с помощью eclipse, я получаю это в перспективе отладки:

enter image description here

Значения не равны нулю> o <</p>

1 Ответ

1 голос
/ 09 декабря 2011

Хорошо, после дальнейших исследований AccountManager я не нашел способа заставить его работать так, как пытался, но я нашел решение.

Вместо того, чтобы сохранять детали как пользовательский пакет данных, я сохраняю их как authToken значения, используя ключ как authTokenType, например:

public boolean save(AccountManager manager) {
    removeAll(manager);
    boolean result = manager.addAccountExplicitly(this, null, toBundle());
    manager.setAuthToken(this, KEY_1, value1);
    manager.setAuthToken(this, KEY_2, value2);
    manager.setAuthToken(this, KEY_3, value3);
    return result;
}

И затем извлекаю значения какэто:

value1 = manager.peekAuthToken(account, KEY_1);

Я до сих пор не уверен, что это способ хранения данных для Account, но это единственный, который мне удалось сделать до сих пор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...