为什么没有调用AccountAuthenticator#getAuthToken()?

时间:2014-01-08 00:56:30

标签: java android accountmanager

我通过扩展AbstractAccountAuthenticator并实施addAccount()getAuthToken()来创建自己的Android帐户身份验证器。其中的一些方法由AccountManager调用,但其他方法则不是。

这很有效:

AccountManager#addAccount()

AccountManager accountManager = AccountManager.get(activity);
accountManager.addAccount(MyAccountAuthenticator.ACCOUNT_TYPE,
    MyAccountAuthenticator.AUTHTOKEN_TYPE_FULL_ACCESS, null, null,
    activity, callback, null);

当我在Activity中拨打AccountManager#getAuthToken()时,问题就出现了。 AccountManager不会调用我在getAuthToken()中定义的AccountAuthenticator方法。它调用一些其他默认方法,仅在启动authToken之前检查是否存在AuthenticatorActivity

这不起作用。它不会调用我的getAuthToken()方法:

AccountManager#getAuthToken()

AccountManager accountManager = AccountManager.get(activity);
accountManager.getAuthToken(
        mAccount, MyAccountAuthenticator.AUTHTOKEN_TYPE_FULL_ACCESS, null,
        activity, callback, handler);

AuthenticatorService

我创建了我的服务并定义了onBind()addAccount()不应该以其他方式工作。

public IBinder onBind(Intent intent) {
    return intent.getAction().equals(ACTION_AUTHENTICATOR_INTENT) ? new MyAccountAuthenticator(this).getIBinder() : null;
}

编辑:在应用为用户获取身份验证令牌后,我在addAccountExplicitly中呼叫MyAuthenticatorActivity

班级MyAuthenticatorActivity extends AccountAuthenticatorActivity的摘录:

if (getIntent().getBooleanExtra(KEY_IS_ADDING_NEW_ACCOUNT, false)) {
    // Creating the account on the device and setting the auth token we recieved
    accountManager.addAccountExplicitly(account, null, null);
}

2 个答案:

答案 0 :(得分:27)

您的评论非常清楚 - 如果您为帐户设置了身份验证令牌,那么在令牌失效之前,您的getAuthToken方法将不会被调用。您通常通过在收到401或403或您从Web服务中获得的内容时致电invalidateAuthToken来执行此操作。

来自getAuthToken方法的Javadoc:

  

如果为此帐户缓存了先前生成的身份验证令牌并键入,则会返回该令牌。否则,如果保存的密码可用,则会将其发送到服务器以生成新的身份验证令牌。否则,将提示用户输入密码。

由于您的令牌位于缓存中,因此会直接返回,并且不会查询您的身份验证器。

答案 1 :(得分:-1)

用于在AccountManager#getAuthToken方法中调用AuthenticatorActivity,您必须通过parcelable方法向活动发送意图,例如:

    final Intent intent = new Intent(mContext, LoginActivity.class);
    intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, accountAuthenticatorResponse);
    intent.putExtra(LoginActivity.ARG_ACCOUNT_TYPE, account.type);
    intent.putExtra(LoginActivity.ARG_AUTH_TYPE, authTokenType);
    intent.putExtra(LoginActivity.ARG_ACCOUNT_NAME, account.name);
    final Bundle bundle = new Bundle();
    bundle.putParcelable(AccountManager.KEY_INTENT, intent);