11

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

在此处输入图像描述

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

在此处输入图像描述

我想知道哪个是最好的方法

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

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


我实际遇到的问题是什么?

如果我删除并再次添加帐户addAccountExplicitly,则创建新帐户需要一些时间,因此我的下一个代码将被执行并且帐户返回null。

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

编辑:

我实际上在做什么?

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

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

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

是否有任何其他解决方案来更新该电子邮件 ID

4

3 回答 3

6

我得到了这个问题的解决方案。

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

解决方案1:

首先,我使用删除帐户removeAccount(),然后尝试在后台线程中执行,同时调用 addAccountExplicitlyaddAccountExplicitly并进行进一步处理。removeAccount()

所以我改变了我的流程,因为我使用removeAccountAccountManager类的方法并在那个处理程序中完成了整个过程,所以我在回调区域内编写了我的代码。

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

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

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

谢谢你。

于 2017-03-17T04:31:46.010 回答
2

问题

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

解决方案

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

步骤 2. 您将在OnAccountsUpdateListener的onAccountsUpdated上收到回调

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

步骤 4. 不要忘记删除您注册的监听器,否则您将遭受内存泄漏。因此,完成后使用removeOnAccountsUpdatedListener

我希望它会有所帮助!

于 2017-03-14T15:10:23.430 回答
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");
}

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

于 2017-03-14T06:36:45.890 回答