当前位置: 首页 > 面试题库 >

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

颛孙霖
2023-03-14
问题内容

我通过扩展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);

当我打电话给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);

AuthenticatorService

我创建了服务并定义onBind()addAccount()否则不应该工作。

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

编辑:
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);
}

问题答案:

您的评论极大地清除了问题-
如果您为帐户设置了身份验证令牌,则getAuthToken在令牌无效之前,您的方法将不会被调用。通常,您可以通过在收到401或403或来自Web服务的消息后调用invalidateAuthToken来执行此操作。

从Javadoc获取getAuthToken方法:

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

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



 类似资料:
  • 问题内容: 我偶然发现了一个问题,可以总结如下: 当我手动创建线程(即通过实例化)时,将适当地调用它。但是,当我与一起使用时,处理程序将被忽略。我错过了什么? 我期望:消息“未捕获的异常…”的三倍 我得到:消息一次(由手动创建的线程触发)。 在Windows 7和Mac OS X 10.5上用Java 1.6复制。 问题答案: 因为异常不会被捕获。 您的ThreadFactory生成的线程没有直接

  • 问题内容: 我只是很好奇,是否有人知道django的orm是否有充分的理由不对模型调用’full_clean’,除非将其保存为模型表单的一部分。 请注意,当你调用模型的save()方法时,不会自动调用full_clean()。要为自己创建的模型运行单步模型验证时,需要手动调用它。 django的完整档案 (注意:报价已针对Django 1.6更新…之前的django文档也对ModelForms提出

  • 问题内容: 我正在尝试制作我的第一个Android应用程序。我注意到,如果数据库不存在,则不会调用该方法来创建表。但是,即使我尝试调试,该方法也无法正常工作。 请查看下面的代码,并给我任何建议。任何帮助将不胜感激。 问题答案: 我也遇到了 SQLiteOpenHelper的 麻烦。对我有用的是存储成员变量 在SQLiteOpenHelper子类中并调用 在构造函数中。 该问题的答案还包括一些有用的

  • 问题内容: 除了JSONP,为什么要遵循相同的域策略? 问题答案: 出于安全原因,已实施“同源起源策略”;引用维基百科的相关句子: 这种机制对现代Web应用程序具有特殊的意义,因为Web服务器广泛依赖于HTTP cookie来维护经过身份验证的用户会话,因为服务器基于HTTP cookie信息进行操作以揭示敏感信息或执行状态更改操作。 必须在客户端维护不相关站点提供的内容之间的严格分隔,以防止丢失

  • 我正在使用forEach循环一个nodeList。我的代码如下 此代码引发错误为 未捕获的TypeError:Array.Foreach不是函数 然而,一些较旧的浏览器还没有实现nodelist.foreach()和array.from()。但是这些限制可以通过使用array.prototype.foreach()来规避(本文档中有更多内容)。 参考:MDN

  • 问题内容: 我有一个expressjs应用程序,在特定的路由上,我调用了一个函数,该函数通过使用数据库文档作为参数来响应数据库中的用户。我使用基于promise的库,并且想在将数据库文档放入响应中的回调内联。但是当我这样做时程序会失败。有人可以解释为什么吗?我还想知道为什么内联调用才能真正起作用。两种方法和之间有一些根本区别吗? 这是一个有效和无效的示例。假定返回用户文档的承诺。 问题答案: 像这