嗨,我在调用
时遇到了恢复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返回null,但是我从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
有什么建议吗?
答案 0 :(得分:3)
正如您在文档中看到的那样,peek方法仅从authtoken-cache获取authToken。如果返回null,则表示您的authtoken已失效,否则方法AccountManager#getAuthToken会返回缓存的。
这有点令人困惑,但我会尝试解释。
您应该知道AccountManager中的getAuthToken与验证者中的getAuthToken-Method不同。 AccountManager正在两者之间进行一些缓存。 意味着如果您在Manager上调用getAuthToken,只要它在缓存中而不调用Authenticator的getAuthToken方法,它就会返回您的AuthToken。
根据我的理解,这意味着在getAuthToken方法中调用peek是完全没有意义的。
我现在如何处理:
在getAuthToken的实现中(在身份验证器中),我从服务器重新请求authtoken并使用新令牌更新帐户,该令牌将它们存储在缓存中。不需要偷看那部分。
答案 1 :(得分:0)
如果您使用android:customTokens=true
声明身份验证器,就会发生这种情况。
您可以在AbstractAccountAuthenticator
docs中阅读更多内容。