Accountmanager.addAccount()vs Accountmanager.addAccountExplicitly()

时间:2016-04-01 09:55:46

标签: android account accountmanager

当我们使用Accountmanager.addAccount()创建包含所有参数的帐户时,我们使用Accountmanager.addAccountExplicitly()的原因。

当我们使用Accountmanager.addAccount()触发AbstractAccountAuthenticator addAccount事件时,我用谷歌搜索了但是有什么意义呢? 为什么我们应该使用addAccount方法?

已更新

我们可以通过这种方式创建帐户:

 Account account = new Account(accountname, accountType);
 mAccountManager.addAccountExplicitly(account, accountPassword, null);

2 个答案:

答案 0 :(得分:10)

经过多次尝试后我终于找到了!

Accountmanager.addAccount()  和 Accountmanager.addAccountExplicitly()是非常不同的方法!

当您致电 Accountmanager.addAccount()时,它会调用与您在 AbstractAccountAuthenticator 中相同的方法来处理所发生的事情。另一方面,当用户转到手机设置/帐户并选择您的自定义帐户类型并按“添加帐户”时,此方法将调用。所以我处理帐户类型和许多东西,并指导用户登录/单页。

public class MyAuthenticator extends AbstractAccountAuthenticator {

    @Override
    public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options) throws NetworkErrorException {

        final Intent intent = new Intent(mContext, DirectLogin.class);
        intent.putExtra(Constants.ARG_ACCOUNT_TYPE, accountType);
        intent.putExtra(Constants.ARG_AUTH_TYPE, authTokenType);
        intent.putExtra(Constants.ARG_IS_ADDING_NEW_ACCOUNT, true);
        intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);

        final Bundle bundle = new Bundle();
        bundle.putParcelable(AccountManager.KEY_INTENT, intent);
        return bundle;
    }

然后在我的活动用户选择创建帐户或登录。在唱歌或注册后,用户从服务器获取令牌并完成操作,最后我使用Accountmanager.addAccountExplicitly()添加帐户。

    String accountName = "name";
    String accountPassword = "password";
    final Account account = new Account(accountName, "account_type");

    AccountManager mAccountManager = AccountManager.get(getBaseContext());

    String authToken = intent.getStringExtra(AccountManager.KEY_AUTHTOKEN);
    String refreshToken = intent.getStringExtra(AccountManager.KEY_USERDATA);
    String authTokenType = AccountGeneral.ACCOUNT_TYPE;
    mAccountManager.addAccountExplicitly(account, accountPassword, null);
    mAccountManager.setAuthToken(account, authTokenType, authToken);
    mAccountManager.setUserData(account, "refreshToken", refreshToken);

答案 1 :(得分:1)

必须使用

Accountmanager.addAccount()来要求用户创建某种类型的帐户。用户必须批准设备并与设备交互,以便确实创建帐户。此方法可用于创建任何类型的帐户。

AccountManager.addAccountExplicitely()允许您在没有用户批准/互动的情况下创建帐户,但它仅限于验证者与您的签名具有相同签名的帐户类型。