7

Java Google Calendar API を使用してカレンダーに接続しようとしています。Java アプリケーションはサービス アカウントを使用します。

私は次のコードを持っています:

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

   GoogleCredential credential = new GoogleCredential.Builder()

  .setTransport(HTTP_TRANSPORT)
  .setJsonFactory(JSON_FACTORY)
  .setServiceAccountId("xxx@developer.gserviceaccount.com") 
  .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();

最後の行で、次のメッセージとともに IOException が発生します。

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

GoogleCredential オブジェクトの値を再確認しましたが、正しい値です。また、ドメイン コンソールにhttps://www.google.com/calendar/feeds/http://www.google.com/calendar/feeds/をアプリケーション ID としてクライアントとして追加し、サード パーティのアプリケーション アクセスを承認しました。

私は一歩を忘れていますか?

4

3 に答える 3

3

API はまだ完成していません。より具体的には、サービス アカウントの部分です。

カレンダーの所有者は、アプリケーションのカレンダー設定でカレンダーを読み書きする権限をアプリケーションに付与する必要があります。カレンダーの共有設定にあり、アカウントの電子メール アドレスを追加して、カレンダーで許可を与えることができます。

この場合、xxx@developer.gserviceaccount.com を、アプリケーションがアクセスする必要があるカレンダーの許可/共有リストに追加する必要がありました。

上記の問題が原因で完全に機能しなかった別の投稿も削除しました。将来他の人に役立つ可能性のあるコードフラグメントが含まれているため、削除を取り消します。ただし、権限の問題と Google カレンダーをサポートしていないサービス アカウントに注意してください

于 2013-08-09T13:24:00.610 に答える
0

私はそれを機能させました

理由はわかりませんが、行を削除しました

.setServiceAccountUser(EMAIL_ADRESS)

また、ドメインスコープにURLを追加しました。

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

動作していなかったリンクを削除しました。

最後に、クライアント宣言のapplicationNameをAPIコンソールと同じ名前に変更しました

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

これらの手順の後、動作を開始しました。

また、これを行った後の将来の参照のために、次のエラーが発生したことにも注意してください。

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

たとえば、次のように変更することでこれを解決しました。

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

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

最初にグーグルサーバーに何か問題があると思いましたが、カレンダーIDにリンクしようとすると明らかに問題が発生します。したがって、アカウントのプライマリカレンダーである「プライマリ」へのリンクは機能します。ただし、ドキュメントによると、特定のカレンダーIDを参照する場合にも機能するはずです。ここで、電子メールアドレスはプライマリカレンダーです。おそらくバグ?

更新:これらのコード修正後、私はまだ問題を抱えていました。詳細については、受け入れられた回答をお読みください。

于 2012-12-18T15:07:03.887 に答える
0

そうです:

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();
       }
于 2013-02-19T14:27:25.493 に答える