4

在 JellyBean 设备上。

我正在关注这个来请求一个 oauth2 令牌,例如

AccountManager am = AccountManager.get(getActivity());
am.invalidateAuthToken(MY_AUTH_TOKEN_TYPE, null);
am.getAuthToken(aGoogleAccount, MY_AUTH_TOKEN_TYPE, null, this, 
    new OnTokenAcquired(), new Handler(new OnError()));

然后根据后面的代码示例进行检查:

private class OnTokenAcquired implements AccountManagerCallback<Bundle> {
@Override
    public void run(AccountManagerFuture<Bundle> result) {
        Bundle bundle = result.getResult();
        ...
        Intent launch = (Intent) bundle.get(AccountManager.KEY_INTENT);
        if (launch != null) {
            startActivityForResult(launch, 0);
            return;
        }
    }
}

我从来没有得到 KEY_INTENT。我理解以下内容:

验证器返回 Intent 的原因可能有很多。这可能是用户第一次登录此帐户。也许用户的帐户已经过期,他们需要重新登录,或者他们存储的凭据不正确。也许该帐户需要双重身份验证,或者需要激活相机进行视网膜扫描。原因是什么并不重要。如果你想要一个有效的令牌,你将不得不触发 Intent 来获得它。

但是,getAuthToken始终会导致权限屏幕或登录屏幕出现在代码命中run令牌有效的方法之前。我试过了:

  1. 开启两步验证。之前请求帐户登录,run因此始终将令牌放入run.
  2. 更改服务器上的密码。之前再次请求帐户登录,run因此始终将令牌放入run.

没有能力尝试视网膜扫描,所以有些不知所措。

编辑 1我遇到的问题是,在某些情况下我会得到 a KEY_INTENT,所以我宁愿现在测试这个代码路径,而不是当它出现在现场时。

提前致谢。

彼得。

4

3 回答 3

4

有机会在一个项目上做类似的事情。这与您的代码不完全相同,我仍然说回调文档有太多“可能”来确定它应该如何工作,但是如果您使用此方法传递falsefor notifyAuthFailure,您将获得 re 的意图- 登录屏幕,如果您更改密码或启用 2FA。这适用于 ClientLogin,但对于 OAuth 2 应该类似(但未测试)。就像是:

// using Calendar ClientLogin for simplicity
Bundle authResult = am.getAuthToken(account, "cl", false, null, null).getResult();
if (authResult.containsKey(AccountManager.KEY_INTENT)) {
  Intent authIntent = authResult.getParcelable(AccountManager.KEY_INTENT);
  // start activity or show notification
}
于 2012-10-27T15:51:59.123 回答
1

我认为你需要打电话getResult(),像这样:

Intent launch = (Intent)result.getResult().get(AccountManager.KEY_INTENT);
于 2012-10-24T15:15:43.040 回答
0

您正在使用 getAuthToken 版本,它使用 Activity 来调用访问授权提示。该版本的 getAuthToken 不返回意图,因为提供的活动用于启动相应的意图。如果要手动启动 Intent,请使用 API 级别 14 中已弃用的 getAuthToken 版本。有关更多信息,请参阅以下内容:http: //developer.android.com/reference/android/accounts/AccountManager.html#getAuthToken %28android.accounts.Account,%20java.lang.String,%20boolean,%20android.accounts.AccountManagerCallback%3Candroid.os.Bundle%3E,%20android.os.Handler%29

于 2014-10-02T16:19:19.743 回答