Аутентификатор учетной записи Android

Когда я вхожу в систему с помощью [email protected] в своем приложении. Он успешно сгенерирует учетную запись с моей электронной почтой, как это

введите описание изображения здесь

Теперь я выхожу из системы и регистрируюсь с помощью другого электронного письма, например [email protected], после чего он генерирует такую ​​учетную запись

введите описание изображения здесь

Я хочу знать, что это лучший способ

1) Удалите первую учетную запись и добавьте вторую учетную запись

2) Обновите первую учетную запись со второй, если ее можно обновить.


Что такое проблема, которую я получаю на самом деле?

Если я удаляю и снова добавляю учетную запись с помощью addAccountExplicitly, для создания новой учетной записи требуется некоторое время, поэтому мой следующий код выполняется, а account возвращает null.

Можно ли обновить учетную запись с помощью updateCredentials, если да, то как?

Отредактировано:

Что я на самом деле?

  • Создание пакета с требуемыми данными для учетной записи

  • Проверка наличия учетной записи с локальными вставленными параметрами пакета "global_user_id". Если он уже существует, мне необходимо обновить EMAIL, который используется как логин (см. выше изображения.)

  • В настоящее время я делаю так: удаление старой учетной записи и добавление новой учетной записи, но следующая строка предназначена для конфигурации SyncAdapter, для которой требуется учетная запись. При этом получение NULL, потому что добавление учетной записи занимает некоторое время в фоновом режиме.

Есть ли другое решение для обновления этого Email Id?

Ответ 1

Я получил решение этой проблемы.

Вопрос: Удаление/добавление учетной записи остается null account object

Решение 1:

Сначала я удалил учетную запись с помощью removeAccount(), а затем попытался addAccountExplicitly НО > t21 > потребовать времени для выполнения в фоновом потоке, а addAccountExplicitly вызвал и выполнил дальнейший процесс.

Итак, я изменил свой поток, поскольку использовал removeAccount метод класса AccountManager и выполнял весь процесс в этом обработчике. Поэтому я пишу свой код внутри области обратного вызова.

 if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
     mAccountManager.removeAccount(accounts[0], LoginActivity.this, new AccountManagerCallback<Bundle>() {
         @Override
         public void run(AccountManagerFuture<Bundle> future) {

             // Creating the account on the device and setting the auth token we got
             // (Not setting the auth token will cause another call to the server to authenticate the user)
             mAccountManager.addAccountExplicitly(account, accountPassword, intent.getBundleExtra(AccountManager.KEY_USERDATA));
             mAccountManager.setAuthToken(account, authTokenType, authToken);

             /**
              * Setting for Sync Adapter
              * Syncing Configuration
              */
              SyncAdapter.configSyncAdapter(mContext);
        }
    }, null);

} else {

    mAccountManager.removeAccount(accounts[0], new AccountManagerCallback<Boolean>() {
        @Override
        public void run(AccountManagerFuture<Boolean> future) {

            // Creating the account on the device and setting the auth token we got
            // (Not setting the auth token will cause another call to the server to authenticate the user)
            mAccountManager.addAccountExplicitly(account, accountPassword, intent.getBundleExtra(AccountManager.KEY_USERDATA));
            mAccountManager.setAuthToken(account, authTokenType, authToken);

            /**
             * Setting for Sync Adapter
             * Syncing Configuration
             */
             SyncAdapter.configSyncAdapter(mContext);
        }
    }, null);
}

Решение 2:

Я нашел метод под названием renameAccount(), но для этого требуется минимальная версия sdk 21. Согласно документам:

Переименуйте указанную учетную запись. Это эквивалентно удалению существующую учетную запись и добавление новой переименованной учетной записи со старым учетные данные пользователя.

Безопасно вызывать этот метод из основного потока.

Спасибо.

Ответ 2

Проблема

когда вы создаете/удаляете учетную запись, она выполняет эту задачу в другом потоке (фоновом потоке) и, следовательно, переходит к следующей строке, которая может иметь нулевое значение.

Решение

Шаг 1. вы должны использовать addOnAccountsUpdatedListener для получения обратного вызова в свой основной поток.

Шаг 2. вы получите обратный вызов onAccountsUpdated OnAccountsUpdateListener

Шаг 3. После того, как вы получите обратный вызов, вы можете поместить свой следующий код внутри этого метода. то есть конфигурация SyncAdapter

Шаг 4. Не забудьте избавиться от слушателя, который вы зарегистрировали, иначе вы будете страдать от утечки памяти. Поэтому после завершения работы removeOnAccountsUpdatedListener

Я надеюсь, что это будет полезно!

Ответ 3

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

AccountManager accountManager = AccountManager.get(this); //this is Activity
Account account = new Account("MyAccount","com.company.demo.account.DEMOACCOUNT");
boolean success = accountManager.addAccountExplicitly(account,"password",null);
if(success){
    Log.d(TAG,"Account created");
}else{
    Log.d(TAG,"Account creation failed. Look at previous logs to investigate");
}

Просто проверьте успех boolean. И выполните свою работу соответственно:)