2012-03-02 34 views
6

Z tym problemem zmagam się już od kilku dni. Próbuję dzwonić do Kalendarza Google za pomocą uwierzytelniania za pomocą Androida AccountManager. Odzyskać tokenu uwierzytelniania przy użyciu zwykłej metody:Uwierzytelnianie za pomocą interfejsu API Google za pomocą konta AccountManager

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

a następnie, z tego powodu, utworzyć instancję Calendar tak:

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(); 

Jednak, kiedy wykonywanie połączeń API za pomocą tego, ja otrzymać błąd 401 Unauthorized przedstawiony poniżej. Zauważ, że umieściłem kod, aby unieważnić wygasłe tokeny uwierzytelniania, więc nie sądzę, że to jest problem.

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" 
} 

Jakieś myśli o tym, co robię źle?

Odpowiedz

11

Tak, jest to możliwe. Po uzyskaniu dojścia do konta Google (zgodnie z opisem) wystarczy poprosić o token uwierzytelniający z AccountManager dla usługi GData.

Jeśli urządzenie z Androidem ma już token autoryzacji (dla konkretnej usługi GData, do której próbujesz uzyskać dostęp), zostanie ono Ci zwrócone. Jeśli nie, AccountManager poprosi o jeden i zwróci go Tobie. Tak czy inaczej, nie musisz się tym martwić, ponieważ obsługuje go AccountManager.

W poniższym przykładzie używam API Google Arkusze:

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"); 

} 

I

Proszę spojrzeć na sample code w danych api google. Po uwierzytelnieniu ważne jest wywołanie GoogleHeaders.setGoogleLogin (String).

Mam nadzieję, że to pomoże.

+0

Okej, obecnie nie nazywam 'setGoogleLogin()', ale szukam przykładowego kodu, który wywołuje '((GoogleHeaders) transport.defaultHeaders) .setGoogleLogin (authToken)', ale to nawet nie działa skompilować dla mnie. Używam google-http-client-1.6.0-beta. "HttpTransport" nie ma już pola 'defaultHeaders'. –

0

Sam doświadczyłem podobnego problemu. Okazało się, że muszę ustawić xoauth_requestor_id na liście kluczy nieznanego (Reference: http://www.yenlo.nl/2011/google-calendar-api-v3-and-2lo/)

Ten pracował dla mnie:

com.google.api.services.calendar.Calendar.CalendarList.List list = calendar.calendarList().list(); 
//Set the requestor id 
list.getUnknownKeys().put("xoauth_requestor_id", "[email protected]"); 

Po tym wywołania API poszedł thru.

Żałuję, że nie było wyjaśnienia, dlaczego identyfikator wnioskodawcy jest potrzebny. Czy ktoś może wyjaśnić?

+0

Próbowałem tego, ale nadal otrzymuję błąd '401 Nieautoryzowany' niestety. –

Powiązane problemy