Проблемы OAuth2 API Календаря Google на Android Honeycomb

Я работаю над приложением Android Honeycomb (v3.0), которое требует взаимодействия с API Календаря Google. Я хочу разрешить моему приложению доступ к данным календаря определенной учетной записи Google для чтения и создания событий.

К сожалению, у меня возникла проблема с авторизацией по OAuth2. Вот что у меня есть на данный момент:

1) Учетная запись Google, календарь которой я хочу получить, зарегистрирована на устройстве Android, с которым я работаю.

2) Я включил Calendar API в консоли API Google в учетной записи.

3) Я могу получить доступ к этой учетной записи, используя следующий код:

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 Calendar вместо Google Tasks. Я успешно получил authToken из AccountManager с учетной записью, которую я хотел бы использовать, используя getAuthToken с AUTH_TOKEN_TYPE == "oauth2: https: / /www.googleapis.com/auth/calendar".

5) Вот где начинаются проблемы.Я сейчас нахожусь в этой точке:

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) Вот исключение, возвращаемое последней строкой:

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 (подождите минуту или около того, чтобы перейти к применимому содержанию ), причиной этого исключения может быть тот факт, что я не включил доступ к API в консоли API Google для учетной записи. Однако, если вы посмотрите на 2), вы увидите, что я это сделал.

8) Мне кажется, что проблема в том, что я не смог правильно установить простой ключ доступа API, потому что метод Calendar.setKey устарел. В руководстве по задачам Google, которое я ранее связал, ключ задается с помощью Tasks.accessKey = "key" . Однако я не уверен, как заставить это работать с Calendar API. Я пробовал несколько учетных записей Google, и все они возникли, за исключением пункта 5).

9) Я хотел бы отметить, что традиционный метод использования OAuth2 мне действительно помог. Вот код, который я использовал для этого:

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 на самом устройстве, чтобы получить рабочий токен OAuth2 для использования с Google Calendar API. Второй метод для меня бесполезен, потому что пользователю придется вручную перейти в свой веб-браузер и получить код авторизации, что неудобно для пользователя.У кого-нибудь есть идеи? Извиняюсь за длинный пост и спасибо!

7
задан BVB 12 December 2011 в 21:24
поделиться