为什么没有调用AccountAuthenticator#getAuthToken()?

Aus*_*ney 11 java android accountmanager

我通过扩展AbstractAccountAuthenticator和实现addAccount()和创建了自己的Android帐户身份验证器getAuthToken().其中的一些方法被称为AccountManager,但其他方法则没有.

这非常有效:

AccountManager#addAccount()

AccountManager accountManager = AccountManager.get(activity);
accountManager.addAccount(MyAccountAuthenticator.ACCOUNT_TYPE,
    MyAccountAuthenticator.AUTHTOKEN_TYPE_FULL_ACCESS, null, null,
    activity, callback, null);
Run Code Online (Sandbox Code Playgroud)

当我打电话给AccountManager#getAuthToken()我时,问题就出现了Activity.AccountManager不会调用getAuthToken()我在我的定义中的方法AccountAuthenticator.它调用一些其他默认方法,只检查authToken启动之前是否存在AuthenticatorActivity.

这不起作用.它不会调用我的getAuthToken()方法:

AccountManager#getAuthToken()

AccountManager accountManager = AccountManager.get(activity);
accountManager.getAuthToken(
        mAccount, MyAccountAuthenticator.AUTHTOKEN_TYPE_FULL_ACCESS, null,
        activity, callback, handler);
Run Code Online (Sandbox Code Playgroud)

AuthenticatorService

我创建了我的服务并定义了onBind().addAccount()不应该工作.

public IBinder onBind(Intent intent) {
    return intent.getAction().equals(ACTION_AUTHENTICATOR_INTENT) ? new MyAccountAuthenticator(this).getIBinder() : null;
}
Run Code Online (Sandbox Code Playgroud)

编辑:addAccountExplicitlyMyAuthenticatorActivity应用程序获取用户的身份验证令牌后调用.

课堂上的片段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);
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*m G 28

您的评论非常清楚 - 如果您为帐户设置了身份验证令牌,那么getAuthToken在令牌失效之前,您的方法将不会被调用.您通常通过在收到401或403时调用invalidateAuthToken或者从Web服务获得什么来执行此操作.

从Javadoc的getAuthToken方法:

如果为此帐户缓存先前生成的身份验证令牌并键入,则会返回该令牌.否则,如果保存的密码可用,则会将其发送到服务器以生成新的身份验证令牌.否则,提示用户输入密码.

由于您的令牌位于缓存中,因此会直接返回,并且不会查询您的身份验证器.

  • 没问题 - 我同意验证员文档通常很差. (6认同)
  • 谢谢.文档在调用身份验证器时以及何时调用自己的代码时都非常模糊.我认为我的验证器应该实现您的报价中描述的功能. (2认同)
  • 这让我很快乐!!那句话 - 如果你为帐户设置了auth令牌,那么在令牌失效之前你的getAuthToken方法就不会被调用 - 让我理解每一个 (2认同)