6

Java Google Calendar API kullanarak bir takvime bağlanmaya çalışıyorum. Java uygulaması bir hizmet hesabı kullanır.Java Google Takvim Hizmet Hesabına Erişim "access_denied" Hizmet Hesabı

Ben ettik aşağıdaki kodu:

java.io.File licenseFile = new java.io.File("39790cb51b361f51cab6940d165c6cda4dc60177-privatekey.p12"); 

    GoogleCredential credential = new GoogleCredential.Builder() 

    .setTransport(HTTP_TRANSPORT) 
    .setJsonFactory(JSON_FACTORY) 
    .setServiceAccountId("[email protected]") 
    .setServiceAccountUser(EMAIL_ADRESS) 
    .setServiceAccountScopes(CalendarScopes.CALENDAR) 
    .setServiceAccountPrivateKeyFromP12File(licenseFile) 
    .build(); 

    client = new com.google.api.services.calendar.Calendar.Builder(
         HTTP_TRANSPORT, JSON_FACTORY, credential) 
         .setApplicationName("Google Calendar Sync").build(); 

    Calendar calendar = client.calendars().get(EMAIL_ADRESS).execute(); 

son satırda ben mesaj ile bir IOException olsun: Ben GoogleCredential nesnesi için değerleri kontrol dubble

ex = (com.google.api.client.auth.oauth2.TokenResponseException) com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request { "error" : "access_denied" }

ve Doğru olduklarından . Ben de üçüncü parti uygulama erişimi

Ben bir adım mi unuttum yetki istemci olarak uygulama kimliği ile alanım konsolunda https://www.google.com/calendar/feeds/, http://www.google.com/calendar/feeds/ ekledik?

+0

Merhaba desteklemeyen izni sorunları ve hizmet hesapları beaware, bunu çalışmak var mı? Ben gmail kapsamı ile çalışıyor ama aynı hatayı alıyorum .. – zhywu

+0

Ben cevap güncellendi;) –

+0

Teşekkür, hizmet hesabı, selam – zhywu

cevap

1

api henüz tamamlanmamıştır. Daha spesifik olarak hizmet hesabı bölümü.

Takvim sahibinin takvimi, takvim ayarlarında okuma/yazma izni vermesi gerekir. Takvimin paylaşım ayarlarında bulunur, burada hesapların e-posta adreslerini ekleyebilir ve takviminize izin verebilirsiniz.Uygulama erişimi gerekli takvimlerin izni/paylaşım listesine [email protected]:

Yani bu durumda ben eklemek zorunda kaldı.

Ben de yukarıda nedeniyle konunun tam işi yoktu başka yayın sildi. Gelecekte diğer insanlara yardımcı olabilecek bazı kod parçalarını içerdiğinden tekrar sileceğim. Ancak Google Calendar

+0

Merhaba Stephan, yardımcı lütfen Sen "hizmet hesaplarının Google Takvim desteklemeyen" dedi, bu yüzden o/o/yönetici bize izin verdiği halde birilerinin google takvim etkinliklerini almak için hizmet hesabını kullanamıyorum? – Jack

0

ben ama

.setServiceAccountUser(EMAIL_ADRESS) 

Ayrıca ben alanı kapsamında fazladan url eklenen çizgiyi silinen neden bilmiyorum

işe aldım:

https://apps-apis.google.com/a/feeds/calendar/resource/#readonly 

ve çalışmayan bir bağlantıyı sildi.

Nihayet ben çalışmaya başladı Bu adımlardan sonra API konsolunda aynı isme müvekkilimin bildiriminde

client = new com.google.api.services.calendar.Calendar.Builder(
         HTTP_TRANSPORT, JSON_FACTORY, credential) 
         .setApplicationName("HolidaySyncs").build(); 

APPLICATIONNAME değiştirdi.

Event result = client.events().insert(<EMAIL ADRESS>, event).execute(); 

Event result = client.events().insert("primary", event).execute(); 

İlk etmek:

{ 
"error": { 
    "errors": [ 
    { 
    "domain": "global", 
    "reason": "notFound", 
    "message": "Not Found" 
    } 
    ], 
    "code": 404, 
    "message": "Not Found" 
} 
} 

Ben mesela değiştirerek bu çözüldü: Ben şu hata vardı bunu sonra

Ayrıca ileride başvurmak üzere not Google sunucularında yanlış bir şey olduğunu anladım, ama denediğinizde yanlış anlaşılıyor. takvim kimliğine bağlamak için Dolayısıyla, bir hesabın birincil takvimi olan "birincil" e bağlanır. Ancak belgelere göre, e-posta adresinin birincil takvim olduğu belirli bir takvim kimliğine başvurduğunuzda da çalışmalıdır. Muhtemelen bir böcek mi?

GÜNCELLEME: bu kod düzeltme işleminden sonra hala sorunlarım var. Daha fazla bilgi için kabul edilen cevabı okuyun.

0

yapmam:

List find = client.events().list(EMAIL_ADRESS); 
DateTime timeMin = new DateTime(DateUtil.stringToDate("01/01/2013")); 
DateTime timeMax = new DateTime(DateUtil.stringToDate("01/02/2013")); 

find.setTimeMin(timeMin); 
find.setTimeMax(timeMax); 

    try{ 
     Events events = find.execute(); 
     int i =0; 

     while (true) { 
      System.out.println("Page: "+(++i)+": "+events.getItems().size()); 
     for (Event event : events.getItems()) { 
      System.out.println(event.getSummary()); 
     } 
     String pageToken = events.getNextPageToken(); 
     if (pageToken != null && !pageToken.isEmpty()) { 
      events = client.events().list(EMAIL_ADRESS).setPageToken(pageToken).execute(); 
     } else { 
      break; 
     } 
     } 

     }catch(GoogleJsonResponseException e){ 
      System.out.println(e.getMessage()); 
//   e.printStackTrace(); 
     } 
İlgili konular