Не могу удалить свою собственную пользовательскую учетную запись

Я гуглил эту проблему, но не нашел решения.

Я создал свой собственный Custom-Account. Когда я пытаюсь удалить учетную запись программно, используя следующий код, учетная запись не удаляется:

Account systemAccount = new Account(mainAccount.getDisplayName(), 
                                    getResources().getString(R.string.account_type));
AccountManager.get(Accounts.this).removeAccount(systemAccount, null, null);

Даже когда я пытаюсь удалить учетную запись из настроек, ничего не происходит. учетная запись удаляется только тогда, когда я удаляю приложение.

Что я должен делать?


person Hazhir    schedule 12.03.2013    source источник
comment
Вы получаете какие-либо ошибки в своем логарифме?   -  person Ahmed Aeon Axan    schedule 12.03.2013
comment
У меня была такая же проблема, и аккаунт попал в такое состояние, что аккаунт можно было удалить из настроек только после очистки данных приложения. Моя проблема заключалась в том, что я использовал синхронный запрос Volley для обновления токена аутентификации, и этот запрос каким-то образом заблокировал мою реализацию AbstractAccountAuthenticator. AccountManagerFuture в моем случае никогда не вызывался.   -  person Mihaela Romanca    schedule 14.05.2014
comment
Не могли бы вы решить это, наконец? Застрял на том же вопросе.   -  person Mukul Gupta    schedule 15.09.2014


Ответы (2)


Вы не используете Future, переданный в качестве параметра методу AccountManagerCallback<Boolean>#run.

Вы должны указать обратный вызов в качестве второго параметра для: public AccountManagerFuture<Boolean> removeAccount (Account account, AccountManagerCallback<Boolean> callback, Handler handler)

myAccountManager.removeAccount(myAccount, new AccountManagerCallback<Boolean>() {
    @Override
    public void run(AccountManagerFuture<Boolean> future) {
        // This is the line that actually starts the call to remove the account.
        boolean wasAccountDeleted = future.getResult();
    }
}, null);

Вы должны быть осторожны, когда вы называете future.getResult(). Его не следует вызывать в основном потоке пользовательского интерфейса. Этот пример не предоставляет этот механизм для краткости.

person Austyn Mahoney    schedule 16.01.2014
comment
future.getResult должен обрабатывать AuthenticatorException и OperationCanceledException ! - person S.Thiongane; 24.04.2015

Две вещи:

  1. Всегда получайте объекты учетной записи от AccountManager, чтобы изменить их.

    final AccountManager accountManager = AccountManager.get(this);
    accountManager.getAccountsByType(Constants.ACCOUNT_TYPE)[0];
    
  2. Убедитесь, что если вы переопределяете getAccountRemovalAllowed на своем Authenticator, вы возвращаете Bundle с логическим значением true, это поведение по умолчанию.

    public Bundle getAccountRemovalAllowed(
            AccountAuthenticatorResponse response, Account account)
            throws NetworkErrorException {
        final Bundle result = new Bundle();
    
        result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true);
    
        return result;
    }
    
person monxalo    schedule 04.10.2013
comment
да, я объяснил, что это поведение по умолчанию. Я просто предупредил, если он переопределит метод. - person monxalo; 16.05.2014