嗨,我打电话时遇到问题,无法恢复我的authToken
mAccountManager.blockingGetAuthToken(Auth.getAccount(), Auth.AUTH_TOKEN_TYPE, true)
我返回一个空字符串,这使我查看了AbstractAccountAuthenticator类,特别是getAuth()。这是它的作用:

public Bundle getAuthToken(AccountAuthenticatorResponse response,
        Account account, String authTokenType, Bundle options)
        throws NetworkErrorException {

    final AccountManager am = AccountManager.get(mContext);

    String authToken = am.peekAuthToken(account, authTokenType);
    String uid = am.getUserData(account, AccountManager.KEY_CALLER_UID);


    // return bundle with authToken
    if (!TextUtils.isEmpty(authToken)) {
        final Bundle result = new Bundle();
        result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
        result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
        result.putString(AccountManager.KEY_AUTHTOKEN, authToken);
        result.putString(AccountManager.KEY_CALLER_UID, uid);
        return result;
    }


    return null;
}

peekAuthToken返回一个空值,但是我从getUserData获取了正确的uid,这使我相信我正在正确添加帐户。这是我设置authToken的方法:
mAccountManager.addAccountExplicitly(account, accountPassword, extraData);
//The addAccount is working, and I can obtain the extraData in getAuth
mAccountManager.setAuthToken(account, Auth.AUTH_TOKEN_TYPE, authtoken);
//I assume this is where the authToken is to be cached…but I can't retrieve it…
//The token does exist at this point

有什么建议么?

最佳答案

如您在文档中所读,peek方法仅从authtoken-cache获取authToken。如果返回的是null,则表明您的身份验证已失效,否则AccountManager#getAuthToken方法将向您返回已缓存的身份验证。

这有点令人困惑,但是我会尽力解释。

您应该注意,AccountManager中的getAuthToken与身份验证器中的getAuthToken-Method不同。 AccountManager在这之间做一些缓存。
意味着,如果您在Manager上调用getAuthToken,它将返回您的AuthToken,只要它在高速缓存中,而无需调用Authenticator的getAuthToken方法。

以我的理解,这意味着在getAuthToken方法内调用peek是完全没有意义的。

我现在该如何处理:

在getAuthToken的实现中(在身份验证器中),我从服务器重新请求authtoken并使用新 token 更新帐户,该新 token 会将它们存储在缓存中。无需在那部分上偷看。

10-04 17:10