SOLVED:
accountManager.invalidateAuthToken(account.type, null); doesn't seem to be
enough.
One has to provide the name of the old token instead of null.
Although the documentation says that the token can be null and it will
invalidate it for the whole account type.
Here is what works:
*try*{
calendarList = CalendarService.calendarList().list().execute();
accountManager.invalidateAuthToken(account.type, myToken);
}*catch* (Exception e) {
e.printStackTrace();
}
On Thursday, November 22, 2012 10:30:41 AM UTC+1, Christopher Masser wrote:
>
>
> I'm using the AccountManager getAuthToken(..) method to retrieve a token
> for Google Calendar sync.
>
> While sync works in most cases, several users report the following error
> when trying to get the calendarList of the Google calendar API:
>
>
> 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"}
> Their native Android calendar app continues to sync normally.i.e., they do
> have internet connection and they do have registered accounts on their
> device.Here is what I do:
>
> AccountManager accountManager = AccountManager.get(this);Account[] accounts =
> accountManager.getAccountsByType("com.google");...//for each
> account:...accountManager.invalidateAuthToken(account.type,
> null);accountManager.getAuthToken(account,
> "oauth2:https://www.googleapis.com/auth/calendar", true, new
> AccountManagerCallback<Bundle>(){ public void
> run(AccountManagerFuture<Bundle> future) { try{
> Bundle bundle = future.getResult();
> if(bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) {
> String token = bundle.getString(AccountManager.KEY_AUTHTOKEN);
> AfterGetToken(token); }else {
> if(bundle.containsKey(AccountManager.KEY_INTENT)) {
> Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT);
> intent.setFlags(intent.getFlags() &
> ~Intent.FLAG_ACTIVITY_NEW_TASK);
> activity.startActivityForResult(intent, REQUEST_AUTHENTICATE);
> //->start all over in onActivityResult }
> } }catch(Exception e){
> e.printStackTrace(); invalidateToken(account, null);
> //->start again } } }, null);
>
>
>
> private void AfterGetToken(String myToken){
>
>
> GoogleCredential credential = new
> GoogleCredential().setAccessToken(myToken);
>
>
> CalendarService = new
>
> com.google.api.services.calendar.Calendar.Builder(transport,
>
> new JacksonFactory(), null)
>
> .setApplicationName(MY_APP_NAME)
>
> .setHttpRequestInitializer(credential)
>
> .setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() {
>
> public void initialize(JsonHttpRequest request) throws IOException {
>
> com.google.api.services.calendar.CalendarRequest calendarRequest =
> (CalendarRequest) request;
>
> calendarRequest.setKey(MY_API_KEY);
>
> calendarRequest.setOauthToken(credential.getAccessToken());
>
> }
>
> }).build();
>
>
> CalendarList calendarList = null;
>
> * try*{
>
> calendarList = CalendarService.calendarList().list().execute();
>
> }*catch* (Exception e) {
>
> e.printStackTrace();
>
> }
>
> ....//do stuff with calendarList
>
> }
>
>
>
> //These are my imports:
>
> *import* android.accounts.Account;
>
> *import* android.accounts.AccountManager;
>
> *import* com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
>
> *import* com.google.api.client.http.HttpTransport;
>
> *import* com.google.api.client.http.javanet.NetHttpTransport;
>
> *import* com.google.api.client.http.json.JsonHttpRequest;
>
> *import* com.google.api.client.http.json.JsonHttpRequestInitializer;
>
> *import* com.google.api.client.json.jackson.JacksonFactory;
>
> *import* com.google.api.services.calendar.CalendarRequest;
>
> *import* com.google.api.services.calendar.model.*CalendarList*;
>
>
>
> Thanks for your help!
>
> Christopher
>
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en