【发布时间】:2015-09-13 00:11:03
【问题描述】:
我通过扩展AbstractAccountAuthenticator 并实现addAccount() 和getAuthToken() 创建了自己的Android 帐户验证器。其中的一些方法被AccountManager 调用,而另一些则不是。
这很好用:
AccountManager accountManager = AccountManager.get(activity);
accountManager.addAccount(MyAccountAuthenticator.ACCOUNT_TYPE,
MyAccountAuthenticator.AUTHTOKEN_TYPE_FULL_ACCESS, null, null,
activity, callback, null);
当我在我的Activity 中调用AccountManager#getAuthToken() 时,就会出现问题。 AccountManager 不会调用我在AccountAuthenticator 中定义的getAuthToken() 方法。它调用其他一些默认方法,仅在启动AuthenticatorActivity 之前检查authToken 的存在。
这不起作用。它不会调用我的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;
}
编辑:在应用为用户取回授权令牌后,我在MyAuthenticatorActivity 中调用addAccountExplicitly。
来自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);
}
【问题讨论】:
-
你在活动中使用过
addAccountExplicitly吗? -
是的,我在
AccountAuthenticatorActivity的子类中调用它。我已将其添加到问题的 EDIT 中。 -
如果调用
getAuthToken的结果是您的登录活动已启动,那么您的身份验证器将被调用 -- Android 没有其他方法可以确定要启动的活动,而不是您作为 Intent 返回的内容.我注意到您正在使用空密码添加帐户。如果你的实现找到一个空通道,也许它会短路?从您的身份验证者那里发布getAuthToken的正文。 -
正如我在问题中提到的,
getAuthToken()在存在现有身份验证令牌集时甚至不会被调用。它绕过调用并只返回身份验证令牌,这不是我期望它做的。我如何解释文档,它仍然应该调用我的方法。然后我可以决定是要返回现有令牌还是获取新令牌(我在返回之前检查身份验证令牌是否已过期)。 -
密码为空,因为我使用的是 OAuth Bearer 令牌。无需设置密码,我从不使用该字段。
getAuthToken方法在实际调用时效果很好,无需在那里查看源代码。
标签: java android accountmanager