Android 在AccountManager中不允许多个帐户

Android 在AccountManager中不允许多个帐户,android,accountmanager,Android,Accountmanager,我已经实现了我的AccountManager验证器和服务以及整个交易,一切似乎都很好 然而,有一个小问题:我只希望我的应用程序在AccountManager中存在一个帐户,但似乎无法找到一种方法来限制它 我唯一的解决方案是在添加新帐户之前搜索并删除当前帐户(按类型) 我当前的代码: private void removeAccounts() { Account [] accounts = mAcctMgr.getAccountsByType (mAccountType); if

我已经实现了我的AccountManager验证器和服务以及整个交易,一切似乎都很好

然而,有一个小问题:我只希望我的应用程序在AccountManager中存在一个帐户,但似乎无法找到一种方法来限制它

我唯一的解决方案是在添加新帐户之前搜索并删除当前帐户(按类型)

我当前的代码:

private void removeAccounts()
{
    Account [] accounts = mAcctMgr.getAccountsByType (mAccountType);

    if (accounts.length == 0) return;

    final Handler handler = new Handler (); 

    AccountManagerCallback<Boolean> callback = new AccountManagerCallback<Boolean>()
    {
        @Override
        public void run(AccountManagerFuture<Boolean> arg0)
        {
           // nada
        }
    };

    for (Account a : accounts) {
        mAcctMgr.removeAccount (a, callback, handler);
    }
}
private void removeAccounts()
{
Account[]accounts=mAcctMgr.getAccountsByType(mAccountType);
如果(accounts.length==0)返回;
最终处理程序=新处理程序();
AccountManagerCallback回调=新建AccountManagerCallback()
{
@凌驾
公共作废运行(AccountManagerFuture arg0)
{
//娜达
}
};
(账户a:账户){
mAcctMgr.removeAccount(a、回调、处理程序);
}
}

我并不认为这是一个优雅的解决方案,但目前似乎是唯一有效的方法。

在Authenticator类(扩展AbstractAccountAuthenticator的类)的addAccount函数中,首先检查帐户是否存在。如果帐户已经存在,只需返回null(并可能显示toast消息)。如果没有帐户,只需像以前一样返回捆绑包

        if(AccountHelper.accountExists(mContext)) {
        mHandler.post(new Runnable() {

            @Override
            public void run() {
                Toast.makeText(mContext, "Only one account allowed", Toast.LENGTH_SHORT).show();
            }
        });
        return null;
    }
根据,如果在创建帐户时出现错误情况,则应返回包含
KEY\u error\u code
KEY\u error\u消息
参数的捆绑包

    if (accountExists) {
        final Bundle result = new Bundle();
        result.putInt(AccountManager.KEY_ERROR_CODE, ERROR_CODE_ONE_ACCOUNT_ALLOWED);
        result.putString(AccountManager.KEY_ERROR_MESSAGE, context.getString(R.string.one_account_allowed));

        handler.post(new Runnable() {

            @Override
            public void run() {
                RepeatSafeToast.show(context, R.string.one_account_allowed);
            }
        });
        return result;
    }

返回
null
并不意味着失败,它意味着结果将通过响应参数传递给
addAccount()
方法。

该链接说明如何重命名帐户,这可能相当于您的请求。但是,它只能从API级别21获得。如果有人想办法为早期的设备制作,请分享

什么是反对搜索帐户并删除或覆盖已经存在的帐户的原因?因为如果有办法将帐户限制为单个帐户,那么这显然是正确的做法。你这样做了吗?我无法覆盖帐户,一旦加载帐户,字段即为最终字段。删除是异步的,并且使用一个完全没有文档记录的接口。将接口方法留空似乎是可行的,但出于明显的原因,我不想这样做。我已经使用了AccountManager,我不知道还有什么其他方法可以将帐户限制为单个帐户。我认为如果用户想要删除旧的对话框,你应该用一个对话框提示他,然后让他创建一个新的对话框。我认为没有比这更优雅的方式了。嗯。。。现在看来还管用。我必须在“run”方法中输入一些处理代码,才能将用户注销服务器。感谢您的回复。我有一个与此相关的问题,我在account manager中创建的帐户能否在卸载后存活下来,这意味着即使用户已卸载该应用程序,我仍然希望account manager在那里,以便在用户重新安装应用程序时使用它在addAccount上返回null:“如果通过响应返回结果,则为null”。您可以拍摄Toast消息,但应返回一个捆绑包,其中包含:“KEY\u ERROR\u CODE和KEY\u ERROR\u message,以指示错误" . 如何检查帐户是否存在?如何解决帐户存在的问题?我不知道如何检测Android帐户管理器中是否存在特定的帐户类型。“我该如何解析accountExists?”accountManager.getAccountsByType(yourType).length;你应该知道你的应用程序帐户类型。