我通过扩展 AbstractAccountAuthenticator
创建了自己的 Android 帐户 validator 并实现 addAccount()
和 getAuthToken()
.其中的一些方法被AccountManager
调用了,但其他人不是。
效果很好:
AccountManager accountManager = AccountManager.get(activity);
accountManager.addAccount(MyAccountAuthenticator.ACCOUNT_TYPE,
MyAccountAuthenticator.AUTHTOKEN_TYPE_FULL_ACCESS, null, null,
activity, callback, null);
问题发生在我调用 AccountManager#getAuthToken()
时在我的 Activity
中。 AccountManager 不会调用我在 AccountAuthenticator
中定义的 getAuthToken()
方法。它调用一些其他默认方法,该方法仅在启动 AuthenticatorActivity
之前检查是否存在 authToken
。
这行不通。它不会调用我的 getAuthToken()
方法:
AccountManager accountManager = AccountManager.get(activity);
accountManager.getAuthToken(
mAccount, MyAccountAuthenticator.AUTHTOKEN_TYPE_FULL_ACCESS, null,
activity, callback, handler);
认证服务
我创建了我的服务并定义了 onBind()
。 addAccount()
否则将无法正常工作。
public IBinder onBind(Intent intent) {
return intent.getAction().equals(ACTION_AUTHENTICATOR_INTENT) ? new MyAccountAuthenticator(this).getIBinder() : null;
}
编辑:在应用为用户取回授权 token 后,我在 MyAuthenticatorActivity
中调用 addAccountExplicitly
。
来自类 MyAuthenticatorActivity extends AccountAuthenticatorActivity
的 fragment :
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);
}
最佳答案
您的评论极大地解决了问题——如果您为帐户设置了身份验证 token ,那么您的 getAuthToken
方法将不会被调用,直到 token 失效。您通常通过调用 invalidateAuthToken 来完成此操作在收到 401 或 403 或您从网络服务得到的结果时。
来自 getAuthToken
方法的 Javadoc:
If a previously generated auth token is cached for this account and type, then it is returned. Otherwise, if a saved password is available, it is sent to the server to generate a new auth token. Otherwise, the user is prompted to enter a password.
由于您的 token 在缓存中,因此它会直接返回,不会咨询您的身份 validator 。
关于java - 为什么不调用 AccountAuthenticator#getAuthToken()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20985094/