Android 未调用AbstractAccountAuthenticator getAuthToken

Android 未调用AbstractAccountAuthenticator getAuthToken,android,token,accountmanager,Android,Token,Accountmanager,我正在使用AbstractAccountAuthenticator的自定义实现,并且根据文档实现了getAuthToken。我一直在学习本教程: 然而,我不理解AbstractAccountAuthenticator实现中的getAuthToken方法何时被调用。我已经在清单中使用我创建的实现它的服务设置了它,创建了登录页面,可以添加帐户,添加令牌,并从使用AccountManager类的活动代码中获取令牌,但任何文档中都没有解释何时调用AbstractAccountAuthenticator代

我正在使用AbstractAccountAuthenticator的自定义实现,并且根据文档实现了getAuthToken。我一直在学习本教程:

然而,我不理解AbstractAccountAuthenticator实现中的getAuthToken方法何时被调用。我已经在清单中使用我创建的实现它的服务设置了它,创建了登录页面,可以添加帐户,添加令牌,并从使用AccountManager类的活动代码中获取令牌,但任何文档中都没有解释何时调用AbstractAccountAuthenticator代码


有人能帮我理解为什么我必须在authenticator似乎未被使用的情况下实现它。

这是因为在应用程序和验证器之间有一个中介,它是Android的
AccountManager

您的验证器实际上是与其关联的帐户类型的“插件”;它不仅可以由您的应用程序使用,还可以由任何其他需要对验证器处理的特定帐户类型进行身份验证的应用程序使用

因此,当您在应用程序清单中设置身份验证器时,该身份验证器将在
AccountManager
中注册。现在,如果应用程序使用“com.google”帐户类型进行身份验证,
AccountManager
将使用谷歌预先注册的身份验证程序。如果它使用帐户类型“com.yourapp.account”进行身份验证,
AccountManager
将使用您的身份验证程序

您的应用程序向
AccountManager
请求身份验证令牌,它会将请求转过来并转发给您的验证器


重读乌迪尼的文章。代码示例演示了它是如何组合在一起的。

在AuthenticatorActivity.java中

private void finishLogin(Intent intent) {
    Log.d("udinic", TAG + "> finishLogin");

    String accountName = intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
    String accountPassword = intent.getStringExtra(PARAM_USER_PASS);
    final Account account = new Account(accountName, intent.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE));

    if (getIntent().getBooleanExtra(ARG_IS_ADDING_NEW_ACCOUNT, false)) {
        Log.d("udinic", TAG + "> finishLogin > addAccountExplicitly");
        String authtoken = intent.getStringExtra(AccountManager.KEY_AUTHTOKEN);
        String authtokenType = mAuthTokenType;

        // Creating the account on the device and setting the auth token we got
        // (Not setting the auth token will cause another call to the server to authenticate the user)
        mAccountManager.addAccountExplicitly(account, accountPassword, null);
        mAccountManager.setAuthToken(account, authtokenType, authtoken);
    } else {
        Log.d("udinic", TAG + "> finishLogin > setPassword");
        mAccountManager.setPassword(account, accountPassword);
    }

    setAccountAuthenticatorResult(intent.getExtras());
    setResult(RESULT_OK, intent);
    finish();
}

mAccountManager.setAuthToken(帐户、authtokenType、authtoken)已设置令牌。您可以删除该行,并添加一个新帐户,然后调用getAuthToken,该方法将被调用。

在authenticator.xml中设置android:customTokens=“true”,在我的abstractaccountauthenticator类实现中启用了对getAuthToken方法的调用。

感谢您的回复,这就是我的想法,但它似乎仍然没有按照我预期的方式工作。为什么当我进入一个断点时,它就不会被击中?当我使用AccountManager GetAuthToken时,我是否绕过了我编写的代码?
AccountManager
决定何时需要使用验证器。如果代码没有被调用,可能是因为
AccountManager
已经有一个它认为有效的令牌。如果您试图让
getAuthToken
在身份验证器上运行,请尝试首先在
AccountManager
上调用
invalidateAuthToken
。乌迪尼的博客上有一个糟糕的流程图,说明了整个互动过程。