当我在我的应用程序中使用 test1@gmail.com 登录时,使用我的电子邮件成功生成帐户
现在我退出并使用不同的电子邮件登录,例如 test2@gmail.com ,然后生成这样的帐户
我想知道哪种方式最好
1)删除第一个帐户并添加第二个帐户
2)如果可以更新,则使用秒更新第一个帐户。
如果我删除并使用addAccountExplicitly
再次添加帐户,则需要一些时间来创建新帐户,以便执行下一个代码并帐户返回 null。 < / p>
是否可以使用updateCredentials
的帮助更新帐户,如果是,那么如何?
我实际上做了什么?
创建包含帐户所需数据的包
检查帐户是否已存在本地插入的捆绑参数&#34; global_user_id&#34;,如果它已经存在,那么我必须更新 EMAIL 用作登录(见上图)。
目前我正在执行,删除旧帐户和添加新帐户,但下一行是 SyncAdapter配置,需要帐户。因为添加帐户需要一些时间在后台。
是否有其他解决方案可以更新电子邮件ID ?
答案 0 :(得分:6)
我解决了这个问题。
问题:删除/添加帐户仍为空account
对象
首先,我使用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);
}
我找到了名为 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");
}
只需检查成功布尔值。并相应地做你的工作:)