Android AccountManager.getUserData() возвращает ноль
У меня есть похожая проблема, как эта AccountManager getUserData возвращает ноль, несмотря на то, что он установлен, но решения не работают для меня
Мой Authenticator.java
public class Authenticator extends AbstractAccountAuthenticator{
private Context context;
public Authenticator(Context context) {
super(context);
this.context = context;
}
@Override
public Bundle editProperties(AccountAuthenticatorResponse response,
String accountType) {
// TODO Auto-generated method stub
return null;
}
@Override
public Bundle addAccount(AccountAuthenticatorResponse response,
String accountType, String authTokenType,
String[] requiredFeatures, Bundle options)
throws NetworkErrorException {
Bundle result = new Bundle();
Intent intent = new Intent(context,LoginActivity.class);
intent.putExtra(AccountManager.KEY_ACCOUNT_TYPE, accountType);
intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
result.putParcelable(AccountManager.KEY_INTENT, intent);
return result;
}
@Override
public Bundle confirmCredentials(AccountAuthenticatorResponse response,
Account account, Bundle options) throws NetworkErrorException {
// TODO Auto-generated method stub
return null;
}
@Override
public Bundle getAuthToken(AccountAuthenticatorResponse response,
Account account, String authTokenType, Bundle options)
throws NetworkErrorException {
return null;
}
@Override
public String getAuthTokenLabel(String authTokenType) {
// TODO Auto-generated method stub
return null;
}
@Override
public Bundle updateCredentials(AccountAuthenticatorResponse response,
Account account, String authTokenType, Bundle options)
throws NetworkErrorException {
// TODO Auto-generated method stub
return null;
}
@Override
public Bundle hasFeatures(AccountAuthenticatorResponse response,
Account account, String[] features) throws NetworkErrorException {
return null;
}
}
Я добавил аккаунт, как это
mAccount = new Account("SalesGenie", "com.ambertag.salesgenie.ACCOUNT");
mAccountManager.addAccountExplicitly(mAccount, password, userData);
Но когда я пытаюсь получить пользовательские данные, позвонив getUserData()
Я получаю ноль
2 ответа
Существует гораздо более простое решение:
Не добавляйте пользовательские данные с addAccountExplicitly(Account, String, Bundle)
, Вместо этого просто передайте пустой пакет и используйте setUserData(Account, String, String)
добавить пользовательские данные после того, как вы создали учетную запись с addAccountExplicitly
,
Это может быть немного менее удобно, но это гарантирует, что кэш пользовательских данных заполнен правильно и не вернется null
,
После некоторого тестирования я нашел эти проблемы.
- Проблема возникает только в учетной записи, созданной после того, как учетная запись была удалена вручную через учетные записи в настройках.
- Перезапуск устройства или переустановка приложения устраняет проблему (до тех пор, пока не произойдет повторное выполнение первого пункта).
- Пока что я видел только проблему на HTC
Решение:
Вызовите метод ниже в addAccount() вашего Authenticator.
/**
* This method is a hack to fix a bug that is found on HTC devices.
*
* The issue is basically when ever an account is manually deleted through the devices
* settings the user data that is saved in the next account that is created is not accessible.
* The solution is to create a temp account and delete it from the app instead. Deleting
* accounts via the AccountManager gets around the bug.
*/
private void htcAccountSyncHack() {
Context appContext = [Application].getInstance();
Account account = new Account([accountName], [accountType]);
AccountManager accountManager = (AccountManager) appContext.getSystemService(
Context.ACCOUNT_SERVICE);
accountManager.addAccountExplicitly(account, null, null);
accountManager.removeAccount(account, null, null);
SharedprefsMgr.setBooleanOnSessionSets(SharedprefsMgr.ACCOUNT_MANUALLY_DELETED, false);
}
В идеале у вас должен быть ContentProvider, зарегистрированный как OnAccountsUpdateListener в AccountManager. Затем вы можете использовать это, чтобы выяснить, была ли учетная запись удалена вручную или нет. Если это не так, нет необходимости каждый раз вызывать этот метод.
Ответ Мартена не помог решить эту проблему в нашем приложении. В документации говорится: "Можно безопасно вызывать этот метод из основного потока", и наше приложение вызывалоAccountManager.getUserData()
в фоновом потоке, который обычно работал нормально, но, видимо, не гарантированно работал.