2012-07-17 103 views
1

我開始使用相同的查詢來獲取日曆事件兩種不同的方式。奇怪的是,一種方式是有效的,而另一種方式則不行,即使一切都幾乎完全相同。在Google的API Explorer中使用timeMin,timeMax會返回第二個方法發送時間的錯誤請求。獲取Google日曆條目Google API Java客戶端

不僅如此,Google Calendar API文檔還說該字段應該是start-min和start-max,而客戶端和API Explorer會說該字段應該是timeMin和timeMax。

下面是方法1,工程代碼:

void setPeriod() { 
    Date nowDate = new Date(); 
    startTime = new DateTime(nowDate); 
    Time t = new Time(); 
    t.setToNow(); 
    t.hour = 23; 
    t.minute = 59; 
    nowDate.setTime(t.toMillis(false)); 
    endTime = new DateTime(nowDate); 
} 

new AsyncTask<Void, Void, Void>() { 
@Override 
protected Void doInBackground(Void... params) { 
    try { 
    Events evlist = g.getClient().events().list(calendarIds.get(cal)).setTimeMin(startTime).setTimeMax(endTime).execute(); 
    if (evlist.getItems() != null) { 
     //Parse the events 
    ... 
}.execute(); 

方法2:

new AsyncTask<Void, Void, List<Event>>() { 
    @Override 
protected List<Event> doInBackground(Void... arg0) { 
    Date nowDate = new Date(); 
    DateTime startTime = new DateTime(nowDate); 
    Time t = new Time(); 
    t.setToNow(); 
    t.hour = 23; 
    t.minute = 59; 
    nowDate.setTime(t.toMillis(true)); 
    DateTime endTime = new DateTime(nowDate); 
    Calendar client = com.google.api.services.calendar.Calendar 
       .builder(transport, jsonFactory) 
       .setApplicationName("Wayk by Senti") 
       .setHttpRequestInitializer(
        new HttpRequestInitializer() { 
         public void initialize(HttpRequest request) 
             throws IOException { 
            request.getHeaders() 
              .setAuthorization(
                GoogleHeaders 
                  .getGoogleLoginValue(authToken)); 
           } 
          }) 
        .setJsonHttpRequestInitializer(
          new JsonHttpRequestInitializer() { 

           public void initialize(
             JsonHttpRequest request) 
             throws IOException { 
            CalendarRequest calendarRequest = (CalendarRequest) request; 
            calendarRequest 
              .setKey(CalendarClientCredentials.KEY); 
           } 
          }).build(); 
      try { 
       List<Event> events = new ArrayList<Event>(); 
       for (int i = currentCal; i < enables.size(); i++) { 
        if (enables.get(i)) { 
         AiLog.v("Getting events"); 
         AiLog.v("AuthToken: " + authToken); 
         AiLog.v("CalendarID: " + calendarIds.get(i)); 
         AiLog.v("Calendar name: " + calendarNames.get(i)); 
         AiLog.v("Calendar account: " + account); 
         Calendar.Events.List eventReq = client.events() 
           .list(calendarIds.get(i)).setTimeMin(startTime).setTimeMax(endTime).execute();//Bad request here 

注意,客戶正是上是相同的。第二種方法中的客戶端成功獲取該帳戶的日曆列表。我已經驗證了日曆ID是正確的,這使我得到了來自startMin和startMax的錯誤。

任何幫助表示讚賞。

乾杯,Z

+1

這是timeMin和timeMax字段的問題。如果你刪除最小和最大時間,它工作正常。我一直在試圖解決與最新的庫相同的問題。事情是在早期版本(日曆api庫v1.5.0),timeMin和timeMax接受字符串值,所以我可以根據時區格式化日期,但現在它已被更改爲接受DateTime值並設置DateTime值,即使使用接受時區轉換的構造函數似乎不起作用併產生400錯誤請求。 – praneetloke 2012-07-19 15:01:16

+0

我也在舊圖書館工作。不過,我終於明白了。檢查答案 – 2012-07-19 22:12:42

回答

9

想通了。

使用DateTime構造函數,接受TimeZone

DateTime startTime = new DateTime(new Date(), TimeZone.getDefault()); 

希望這樣可以節省別人的16個小時裏,我花了試圖弄清楚這一點。真的很糟糕的文件。

+0

謝謝。我正在使用DateTime構造函數,該構造函數接受tz shift int,但它不起作用,但傳遞了Date對象和TimeZone對象的默認實例! – praneetloke 2012-07-20 03:10:28

相關問題