2013-03-12 12 views
4

У меня есть проблема с Google, но я не нашел решения.Не удалось удалить свою собственную учетную запись

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

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

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

Что мне делать?

+0

Есть ли ошибки в вашем логарифме? –

+0

Нет, ничего .... – Hazhir

+0

У меня была такая же проблема, и учетная запись попала в такое состояние, что учетная запись может быть удалена из настроек только после очистки данных приложения. Моя проблема заключалась в том, что я использовал синхроничный запрос Volley для обновления токена аутентификации, и этот запрос каким-то образом заблокировал мою реализацию AbstractAccountAuthenticator. AccountManagerFuture в моем случае никогда не вызывался. –

ответ

2

Две вещи:

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

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

    public Bundle getAccountRemovalAllowed(
         AccountAuthenticatorResponse response, Account account) 
         throws NetworkErrorException { 
        final Bundle result = new Bundle(); 
    
        result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true); 
    
        return result; 
    } 
    
+0

выглядит так: 'AbstractAccountAuthenticator' уже делает это – sherpya

+0

Да, я объяснил, что это поведение по умолчанию. Я просто предупредил, что он переопределяет метод. – monxalo

4

Вы не используете 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(). Его не следует вызывать в основном потоке пользовательского интерфейса. Этот пример не обеспечивает этот механизм для краткости.

+0

'future.getResult' должен обрабатывать' AuthenticatorException' и 'OperationCanceledException'! –

+1

Оставленный как упражнение для читателя :) –

+0

О, хорошо! удачи им, хотя :) –

Смежные вопросы