6

我已经为此苦苦挣扎了几天。我正在尝试通过 Android 的AccountManager. 我使用常用​​方法检索身份验证令牌:

AccountManager manager = AccountManager.get(this);
String authToken = manager.getAuthToken(account, AUTH_TOKEN_TYPE, true, null, null).getResult().getString(AccountManager.KEY_AUTHTOKEN);

然后,使用该令牌,我创建了一个Calendar这样的实例:

HttpTransport transport = AndroidHttp.newCompatibleTransport();
JacksonFactory jsonFactory = new JacksonFactory();
GoogleAccessProtectedResource accessProtectedResource = new GoogleAccessProtectedResource(accessToken);
Calendar calendar = Calendar.builder(transport, jsonFactory).setApplicationName("MyApp/1.0").setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() {
    @Override
    public void initialize(JsonHttpRequest request) {
        CalendarRequest calendarRequest = (CalendarRequest) request;
        calendarRequest.setKey(API_KEY);
    }
}).setHttpRequestInitializer(accessProtectedResource).build();

但是,当我使用它进行 API 调用时,我收到401 Unauthorized如下所示的错误。请注意,我已经包含了使过期的身份验证令牌无效的代码,所以我认为这不是问题所在。

com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
{
    "code" : 401,
    "errors" : [ {
        "domain" : "global",
        "location" : "Authorization",
        "locationType" : "header",
        "message" : "Invalid Credentials",
        "reason" : "authError"
    } ],
    "message" : "Invalid Credentials"
}

关于我可能做错了什么的任何想法?

4

2 回答 2

11

是的,这是可能的。一旦您处理了 Google 帐户(如您所述),您只需要从 AccountManager 请求 GData 服务的身份验证令牌。

如果 android 设备已经有一个身份验证令牌(对于您尝试访问的特定 GData 服务),它将返回给您。如果没有,AccountManager 将请求一个并将其返回给您。无论哪种方式,您都无需担心这一点,因为 AccountManager 会处理它。

在以下示例中,我使用的是 Google 电子表格 API:

ArrayList<Account> googleAccounts = new ArrayList<Account>();

// Get all accounts 
Account[] accounts = accountManager.getAccounts();
  for(Account account : accounts) {
    // Filter out the Google accounts
    if(account.type.compareToIgnoreCase("com.google")) {
      googleAccounts.add(account);
    }
  }
AccountManager accountManager = AccountManager.get(activity);

// Just for the example, I am using the first google account returned.
Account account = googleAccounts.get(0);

// "wise" = Google Spreadheets
AccountManagerFuture<Bundle> amf = accountManager.getAuthToken(account, "wise", null, activity, null, null);

try {
  Bundle authTokenBundle = amf.getResult();
  String authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN);

  // do something with the token
  InputStream response = sgc.getFeedAsStream(feedUrl, authToken, null, "2.1");

}

请查看 google data api 中的示例代码。身份验证后要做的重要事情是调用 GoogleHeaders.setGoogleLogin(String)。

我希望这有帮助。

于 2012-03-02T05:22:19.310 回答
0

我自己也遇到了类似的问题。我发现我需要在未知密钥列表中设置 xoauth_requestor_id(参考:http ://www.yenlo.nl/2011/google-calendar-api-v3-and-2lo/ )

这对我有用:

com.google.api.services.calendar.Calendar.CalendarList.List list = calendar.calendarList().list();
//Set the requestor id
list.getUnknownKeys().put("xoauth_requestor_id", "user@gmail.com");

在此之后,API 调用通过。

我希望能解释为什么需要请求者 ID。有人可以解释吗?

于 2012-03-13T05:25:02.607 回答