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

Reply via email to