java - 为什么不调用 AccountAuthenticator#getAuthToken()?

标签 java android accountmanager

我通过扩展 AbstractAccountAuthenticator 创建了自己的 Android 帐户 validator 并实现 addAccount()getAuthToken() .其中的一些方法被AccountManager调用了,但其他人不是。

效果很好:

AccountManager#addAccount()

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#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/

相关文章:

java - 如何从接口(interface)类型的实现中获取该接口(interface)未提供的特定方法?

android - 带有全选复选框的可扩展 ListView : group itemclick and scrolling bug

android - Android客户端中AccountManager的AuthToken不再工作

java - Tomcat 8 正在运行但拒绝连接

java - JSF/Primefaces 选择一个菜单会导致问题

Android N - 尽管 minSDK 设置为 14,但无法在较低的 API 上运行

java - 当网络服务中的纬度和经度发生变化时,如何移动谷歌地图中的标记?

android - 更改android自定义帐户的用户名和密码

java - SQLite 比较两个密码时,如果它们不匹配,而 sysout 会正确打印它们