我通过扩展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不会调用我在getAuthToken()
中定义的AccountAuthenticator
方法。它调用一些其他默认方法,仅在启动authToken
之前检查是否存在AuthenticatorActivity
。
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;
}
编辑:在应用为用户获取身份验证令牌后,我在addAccountExplicitly
中呼叫MyAuthenticatorActivity
。
班级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);
}
答案 0 :(得分:27)
您的评论非常清楚 - 如果您为帐户设置了身份验证令牌,那么在令牌失效之前,您的getAuthToken
方法将不会被调用。您通常通过在收到401或403或您从Web服务中获得的内容时致电invalidateAuthToken来执行此操作。
来自getAuthToken
方法的Javadoc:
如果为此帐户缓存了先前生成的身份验证令牌并键入,则会返回该令牌。否则,如果保存的密码可用,则会将其发送到服务器以生成新的身份验证令牌。否则,将提示用户输入密码。
由于您的令牌位于缓存中,因此会直接返回,并且不会查询您的身份验证器。
答案 1 :(得分:-1)
用于在AccountManager#getAuthToken方法中调用AuthenticatorActivity,您必须通过parcelable方法向活动发送意图,例如:
final Intent intent = new Intent(mContext, LoginActivity.class);
intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, accountAuthenticatorResponse);
intent.putExtra(LoginActivity.ARG_ACCOUNT_TYPE, account.type);
intent.putExtra(LoginActivity.ARG_AUTH_TYPE, authTokenType);
intent.putExtra(LoginActivity.ARG_ACCOUNT_NAME, account.name);
final Bundle bundle = new Bundle();
bundle.putParcelable(AccountManager.KEY_INTENT, intent);