Pracuję nad aplikacją Android Honeycomb (v3.0), która wymaga komunikacji z interfejsem API Kalendarza Google. Chciałbym zezwolić mojej aplikacji na dostęp do danych Kalendarza konkretnego konta Google w celu odczytywania i tworzenia zdarzeń.Google Calendar API OAuth2 - problemy z Androidem Honeycomb
Niestety, wystąpił problem z autoryzacją przy użyciu OAuth2. Oto, co mam do tej pory:
1) Konto Google, do którego chciałbym uzyskać dostęp, jest zarejestrowane na urządzeniu z Androidem, z którym współpracuję.
2) Włączyłem interfejs API Kalendarza w konsoli Google API na tym koncie.
3) Jestem w stanie uzyskać dostęp do konta za pomocą następującego kodu:
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) Chciałbym teraz, aby uzyskać AuthToken do użytku w komunikacji z kalendarza. Postępowałem zgodnie z tym tutorial, ale wszystko przekonwertowałem do pracy z Kalendarzem Google zamiast z Zadaniami Google. Pomyślnie pobieram authToken
z AccountManager
z kontem, którego chciałbym użyć, używając getAuthToken
z AUTH_TOKEN_TYPE == "oauth2:https://www.googleapis.com/auth/calendar"
.
5) Oto, gdzie zaczynają się problemy. Jestem teraz w tym momencie:
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) Oto wyjątek zwrócony przez ostatniego wiersza:
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) Zgodnie z tym Google API Video (odczekać minutę lub tak aby dostać się do obowiązującej treści) powodem tego wyjątku może być fakt, że nie umożliwiłem dostępu API do konta w konsoli Google APIs. Jednak jeśli spojrzysz na 2), zobaczysz, że to zrobiłem.
8) Wydaje mi się, że problem polega na tym, że nie byłem w stanie poprawnie ustawić klucza dostępu do prostego interfejsu API, ponieważ metoda Calendar.setKey
jest przestarzała. W samouczku zadań Google, który wcześniej połączono, klucz ustawia się przy użyciu Tasks.accessKey = "key"
. Nie wiem jednak, jak to działa z interfejsem Calendar API. Wypróbowałem wiele kont Google, z których każdy wymyślił wyjątek od 5).
9) Chciałbym podkreślić, że tradycyjna metoda korzystania z OAuth2 zadziałała właśnie dla mnie. Oto kod użyłem do tego:
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) Wreszcie, moje pytanie: Chciałbym użyć konta z AccountManager na samym urządzeniu w celu pobrania działającego OAuth2 żeton do użytku z Kalendarza Google API. Druga metoda nie jest dla mnie przydatna, ponieważ użytkownik będzie musiał ręcznie otworzyć przeglądarkę i uzyskać kod autoryzacji, który nie jest przyjazny dla użytkownika. Ktoś ma jakieś pomysły? Przepraszam za długi post i dziękuję!
Witam, jestem w obliczu podobnego problemu, kiedyś ten kod fragmenty dostać kalendarza działających aplikacji, ale potem dostać 403 , dostęp zabroniony błąd, co uld u proszę pomóż, co powinienem zrobić w Androidzie? chociaż nie używam również opcji 8 jako opcji. proszę hlp. –
Czego używasz jako opcji? Czy sprawdziłeś odpowiedź @ eltrl? – BVB