Android Honeycomb 上的 Google Calendar API OAuth2 问题 [英] Google Calendar API OAuth2 Troubles on Android Honeycomb

本文介绍了Android Honeycomb 上的 Google Calendar API OAuth2 问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个需要与 Google Calendar API 通信的 Android Honeycomb (v3.0) 应用程序.我想允许我的应用程序访问特定 Google 帐户的日历数据,以便读取和创建事件.

I am working on an Android Honeycomb (v3.0) application that has a requirement of communicating with the Google Calendar API. I would like to allow my application to access a particular Google account's Calendar data in order to read and create events.

不幸的是,我在使用 OAuth2 进行授权时遇到了问题.这是我到目前为止所拥有的:

Unfortunately, I ran into a problem with authorization using OAuth2. Here's what I have so far:

1) 我要访问其日历的 Google 帐户已在我使用的 Android 设备中注册.

1) The Google account whose calendar I would like to access is registered within the Android device I am working with.

2) 我在帐户的 Google API 控制台中启用了日历 API.

2) I enabled the Calendar API within the Google APIs Console on the account.

3) 我可以使用以下代码访问此帐户:

3) I am able to access this account using the following code:

AccountManager accountManager = AccountManager.get(this.getBaseContext());
Account[] accounts = accountManager.getAccountsByType("com.google");
Account acc = accounts[0]; // The device only has one account on it

4) 我现在想获取一个 AuthToken 以在与日历通信时使用.我跟着这个教程,但转换一切都可以使用 Google 日历而不是 Google Tasks.我使用 getAuthTokenAUTH_TOKEN_TYPE == "oauth2:https://www.googleapis.com/auth/calendar".

4) I would now like to obtain an AuthToken for use when communicating with the calendar. I followed this tutorial, but converted everything to work with Google Calendar instead of Google Tasks. I successfully retrieve an authToken from the AccountManager with the account I would like to use by using getAuthToken with AUTH_TOKEN_TYPE == "oauth2:https://www.googleapis.com/auth/calendar".

5) 这就是问题开始的地方.我现在在这一点上:

5) Here's where the problems begin. I am now at this point:

AccessProtectedResource accessProtectedResource = new GoogleAccessProtectedResource(tokens[0]); // this is the correct token
HttpTransport transport = AndroidHttp.newCompatibleTransport();
Calendar service = Calendar.builder(transport, new JacksonFactory())
    .setApplicationName("My Application's Name")
    .setHttpRequestInitializer(accessProtectedResource)
    .build();
service.setKey("myCalendarSimpleAPIAccessKey"); // This is deprecated???
Events events = service.events().list("primary").execute(); // Causes an exception!

6) 这是最后一行返回的异常:

6) Here's the exception returned by the last line:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "usageLimits",
    "message" : "Daily Limit Exceeded. Please sign up",
    "reason" : "dailyLimitExceededUnreg",
    "extendedHelp" : "https://code.google.com/apis/console"
  } ],
  "message" : "Daily Limit Exceeded. Please sign up"
}

7) 根据这个 Google API 视频(稍等片刻以获取适用的内容),出现此异常的原因可能是我没有在该帐户的 Google API 控制台中启用 API 访问.但是,如果您查看 2),您会发现我这样做了.

7) According to this Google API Video (wait a minute or so to get to the applicable content), a reason for this exception may be the fact that I did not enable the API access within the Google APIs Console for the account. However, if you look at 2), you can see that I did do so.

8) 对我来说,问题似乎是我无法正确设置简单 API 访问密钥,因为不推荐使用 Calendar.setKey 方法.在我之前链接的 Google Tasks 教程中,密钥是使用 Tasks.accessKey = "key" 设置的.不过,我不确定如何使用 Calendar API 来实现这一点.我尝试了多个 Google 帐户,但都出现了 5 的异常).

8) To me, it seems that the problem is that I was unable to set the Simple API Access Key correctly, because the Calendar.setKey method is deprecated. Within the Google Tasks tutorial that I previously linked, the key is set using Tasks.accessKey = "key". I'm not sure how to get this working with the Calendar API, though. I have tried multiple Google accounts, which all came up with the exception from 5).

9) 我想指出使用 OAuth2 的传统方法对我有用.这是我用于此的代码:

9) I would like to point out that the traditional method of using OAuth2 did work for me. Here's the code I used for that:

HttpTransport TRANSPORT = new NetHttpTransport();
JsonFactory JSON_FACTORY = new JacksonFactory();
String SCOPE = "https://www.googleapis.com/auth/calendar";
String CALLBACK_URL = "urn:ietf:wg:oauth:2.0:oob";
String CLIENT_ID = "myClientID";
String CLIENT_SECRET = "myClientSecret";
String authorizeUrl = new GoogleAuthorizationRequestUrl(CLIENT_ID, CALLBACK_URL, SCOPE).build();
String authorizationCode = "???"; // At this point, I have to manually go to the authorizeUrl and grab the authorization code from there to paste it in here while in debug mode

GoogleAuthorizationCodeGrant authRequest = new GoogleAuthorizationCodeGrant(TRANSPORT, JSON_FACTORY, CLIENT_ID, CLIENT_SECRET, authorizationCode, CALLBACK_URL);
authRequest.useBasicAuthorization = false;
AccessTokenResponse authResponse = authRequest.execute();
String accessToken = authResponse.accessToken; // gets the correct token

GoogleAccessProtectedResource access = new GoogleAccessProtectedResource(accessToken, TRANSPORT, JSON_FACTORY, CLIENT_ID, CLIENT_SECRET, authResponse.refreshToken);
HttpRequestFactory rf = TRANSPORT.createRequestFactory(access);
AccessProtectedResource accessProtectedResource = new GoogleAccessProtectedResource(accessToken);
HttpTransport transport = AndroidHttp.newCompatibleTransport();

Calendar service = Calendar.builder(transport, new JacksonFactory())
    .setApplicationName("My Application's Name")
    .setHttpRequestInitializer(accessProtectedResource)
    .build();

Events events = service.events().list("primary").execute(); // this works!

10) 最后,我的问题是:我想在设备本身上使用 AccountManager 中的帐户,以便检索可用于 Google Calendar API 的有效 OAuth2 令牌.第二种方法对我来说没有用,因为用户必须手动转到他们的 Web 浏览器并获取授权代码,这对用户不友好.有人有想法么?为长篇文章道歉,谢谢!

10) Finally, my question: I would like to use the account from the AccountManager on the device itself in order to retrieve a working OAuth2 token for use with the Google Calendar API. The second method is not useful for me, because the user will have to manually go to their web browser and get the authorization code, which is not user friendly. Anyone have any ideas? Apologies for the long post, and thanks!

推荐答案

尝试将 JsonHttpRequestInitializer 添加到构建器并在那里设置您的密钥:

Try adding a JsonHttpRequestInitializer to the builder and setting your key there:

Calendar service = Calendar.builder(transport, new JacksonFactory())
.setApplicationName("My Application's Name")
.setHttpRequestInitializer(accessProtectedResource)
.setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() {
    public void initialize(JsonHttpRequest request) {
        CalendarRequest calRequest = (CalendarRequest) request;
        calRequest.setKey("myCalendarSimpleAPIAccessKey");
    }

}).build();

这篇关于Android Honeycomb 上的 Google Calendar API OAuth2 问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆