Я работаю над приложением Android Honeycomb (v3.0), которое требует взаимодействия с API Календаря Google. Я хотел бы разрешить моему приложению получать доступ к данным Календаря определенной учетной записи Google для чтения и создания событий.
К сожалению, я столкнулся с проблемой авторизации с использованием OAuth2. Вот что у меня есть:
1) Учетная запись Google, календарь которой я хочу открыть, зарегистрирована на устройстве Android, с которым я работаю.
2) Я включил Календарь 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 вместо 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 Video (подождите минуту или около того, чтобы получить доступ к соответствующему контенту), причиной этого исключения может быть тот факт, что я не включил доступ к API в Консоль API Google для учетной записи. Однако, если вы посмотрите на 2), вы увидите, что я сделал это.
8) Мне кажется, что проблема в том, что я не смог правильно установить ключ доступа Simple API, потому что метод Calendar.setKey
устарел. В учебнике Google Tasks, который я ранее связывал, ключ устанавливается с помощью Tasks.accessKey = "key"
. Я не уверен, как заставить это работать с Календарным 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 для использования с API Календаря Google. Второй способ для меня бесполезен, потому что пользователю придется вручную зайти в свой веб-браузер и получить код авторизации, который не очень удобен для пользователя. У кого-нибудь есть идеи? Извиняюсь за длинный пост, и спасибо!