Android帐户身份验证器编辑电子邮件ID凭据

时间:2017-03-11 05:04:23

标签: android accountmanager android-account android-authenticator

当我在我的应用程序中使用 test1@gmail.com 登录时,使用我的电子邮件成功生成帐户

enter image description here

现在我退出并使用不同的电子邮件登录,例如 test2@gmail.com ,然后生成这样的帐户

enter image description here

我想知道哪种方式最好

1)删除第一个帐户并添加第二个帐户

2)如果可以更新,则使用秒更新第一个帐户。

实际上我遇到了什么问题?

如果我删除并使用addAccountExplicitly再次添加帐户,则需要一些时间来创建新帐户,以便执行下一个代码并帐户返回 null。 < / p>

是否可以使用updateCredentials的帮助更新帐户,如果是,那么如何?

编辑:

我实际上做了什么?

  • 创建包含帐户所需数据的包

  • 检查帐户是否已存在本地插入的捆绑参数&#34; global_user_id&#34;,如果它已经存在,那么我必须更新 EMAIL 用作登录(见上图)。

  • 目前我正在执行,删除旧帐户和添加新帐户,但下一行是 SyncAdapter配置,需要帐户。因为添加帐户需要一些时间在后台。

是否有其他解决方案可以更新电子邮件ID

3 个答案:

答案 0 :(得分:6)

我解决了这个问题。

问题:删除/添加帐户仍为空account对象

解决方案1:

首先,我使用removeAccount()删除了帐户,然后尝试addAccountExplicitly但是removeAccount()花时间执行后台主题,而 addAccountExplicitly 呼吁并做进一步的过程。

所以我改变了流程,因为我使用 {Account> 类的 removeAccount 方法并在该处理程序中执行整个过程,所以我在回调区。

 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。 根据文档:

  

重命名指定的帐户。这相当于删除了   现有帐户并使用旧帐户添加新的重命名帐户   帐户的用户数据。

     

从主线程调用此方法是安全的。

谢谢。

答案 1 :(得分:2)

<强>问题

当您创建/删除帐户时,它会在不同的线程(后台线程)中执行该任务,因此它会转到下一行,该行可能具有空值。

<强>解决方案

第1步。 你应该使用addOnAccountsUpdatedListener来接收你主线程的回调。

第2步。 您将在onAccountsUpdated

OnAccountsUpdateListener收到回电

第3步。 收到回调后,您可以将该下一个代码放在该方法中。即:SyncAdapter配置

第4步。 不要忘记摆脱你注册的听众,否则你会遭受内存泄漏。因此,一旦完成,请使用removeOnAccountsUpdatedListener

我希望它会有所帮助!

答案 2 :(得分:0)

我认为您应删除第一个帐户,然后添加新帐户。至于您在执行帐户之前执行的代码问题,您可以通过

来控制它
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");
}

只需检查成功布尔值。并相应地做你的工作:)