Android帐户验证器编辑电子邮件Id凭据

Android帐户验证器编辑电子邮件Id凭据,android,accountmanager,android-account,android-authenticator,Android,Accountmanager,Android Account,Android Authenticator,当我使用test1@gmail.com在我的应用程序中。它成功地用我的电子邮件生成帐户,如下所示 现在我注销并使用不同的电子邮件登录,如test2@gmail.com然后它会生成这样的帐户 我想知道哪种方法最好 1)删除第一个帐户并添加第二个帐户 2)如果有可能,用第二个帐户更新第一个帐户。 我到底遇到了什么问题? 如果我使用addaccountexplicit删除并再次添加帐户,则创建新帐户需要一些时间,因此我的下一个代码将被执行,account返回null。 是否可以使用updateC

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

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

我想知道哪种方法最好

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

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


我到底遇到了什么问题? 如果我使用
addaccountexplicit
删除并再次添加帐户,则创建新帐户需要一些时间,因此我的下一个代码将被执行,account返回null。

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

编辑: 我到底在做什么

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

  • 使用本地插入的bundle参数“global_user_id”检查帐户是否已存在,如果该帐户已存在,则我必须更新用作登录的电子邮件(参见上图)

  • 目前我正在做的是,删除旧帐户并添加新帐户,但下一行是针对需要帐户的SyncAdapter配置。在这种情况下,获取NULL,因为添加帐户需要在后台花费一些时间


是否有其他解决方案更新该电子邮件Id

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

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");
}

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

问题

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

解决方案

第一步。 您应该使用接收对主线程的回调

第二步。 您将在的收到回电

第三步。 收到回调后,可以将下一个代码放在该方法中。i、 e:同步适配器配置

第四步。 别忘了把你注册的监听器处理掉,否则你会遭受内存泄漏的痛苦。所以,一旦你完成了,就使用它


我希望这会有帮助

我找到了这个问题的解决办法

问题:删除/添加帐户保持空
帐户
对象

解决方案1: 首先,我使用
removeAccount()
删除了帐户,然后尝试
addaccountexplicit
removeAccount()
花时间在后台线程中执行addaccountexplicit调用并执行进一步的过程

因此,我改变了我的流程,因为我使用了AccountManager类的
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);
}
if(Build.VERSION.SDK\u INT>Build.VERSION\u code.LOLLIPOP\u MR1){
mAccountManager.removeAccount(帐户[0],LoginActivity.this,新帐户管理器Callback(){
@凌驾
公共作废运行(AccountManagerFuture){
//在设备上创建帐户并设置我们获得的身份验证令牌
//(未设置身份验证令牌将导致对服务器的另一次调用以验证用户身份)
AccountManager.addAccountExplicit(account、accountPassword、intent.getBundleExtra(AccountManager.KEY_USERDATA));
setAuthToken(帐户、authTokenType、authToken);
/**
*同步适配器的设置
*同步配置
*/
SyncAdapter.configSyncAdapter(mContext);
}
},空);
}否则{
mAccountManager.removeAccount(帐户[0],新帐户管理器Callback(){
@凌驾
公共作废运行(AccountManagerFuture){
//在设备上创建帐户并设置我们获得的身份验证令牌
//(未设置身份验证令牌将导致对服务器的另一次调用以验证用户身份)
AccountManager.addAccountExplicit(account、accountPassword、intent.getBundleExtra(AccountManager.KEY_USERDATA));
setAuthToken(帐户、authTokenType、authToken);
/**
*同步适配器的设置
*同步配置
*/
SyncAdapter.configSyncAdapter(mContext);
}
},空);
}
解决方案2: 我找到了名为的方法,但它至少需要sdk版本21。 根据文件:

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

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


谢谢。

用户注销时,您是否应该删除该帐户?@MariusBoeple nop,我只是使帐户访问令牌无效。好的,但如果我在应用程序中注销,我不想在设置中再看到我的帐户。。。尽管如此,我想知道如何更改电子邮件,因为我正在使用AccountAuthenticator,用户可能希望更改他的电子邮件地址。它转到其他部分,我认为因为帐户已经存在。(在添加帐户之前,我正在删除帐户,可能当时没有删除。)这可能是问题所在,但此处的代码工作正常,删除后只需检查电子邮件:)@Pratikbutanical实际上,只有当用户更改其配置文件时,您的答案才有用,但是我有不同的流程,因为我在注销/登录时也必须更改。非常感谢。