2014-01-27 38 views
1

我正在嘗試編寫一個類,以將事件添加到用戶的日曆中(不使用意圖)。我需要最終能夠在一個循環中添加多達7個事件,所以我們無法通過將控制權轉移到日曆以供用戶確認的方法來實現。在沒有用戶確認的情況下將事件添加到日曆

不幸的是,我沒有得到任何地方。我從logcat中得到的唯一反饋是一個警告:Cursor finalized without prior close()

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
public class AddToCalendar { 

    Context context; 

    // Projection array. Creating indices for this array instead of doing 
    // dynamic lookups improves performance. 
    public static final String[] EVENT_PROJECTION = new String[] { 
     Calendars._ID,       // 0 
     Calendars.ACCOUNT_NAME,     // 1 
     Calendars.CALENDAR_DISPLAY_NAME,   // 2 
     Calendars.OWNER_ACCOUNT     // 3 
    }; 

    // The indices for the projection array above. 
    private static final int PROJECTION_ID_INDEX = 0; 
    private static final int PROJECTION_ACCOUNT_NAME_INDEX = 1; 
    private static final int PROJECTION_DISPLAY_NAME_INDEX = 2; 
    private static final int PROJECTION_OWNER_ACCOUNT_INDEX = 3; 

    public AddToCalendar (Context context) { 
     this.context = context; 
    } 

    public Cursor getCalendars() { 
     Cursor cursor = null; 
     ContentResolver cr = context.getContentResolver(); 
     Uri uri = Calendars.CONTENT_URI; 
     String selection = "((" + Calendars.ACCOUNT_NAME + " = ?) AND (" 
           + Calendars.ACCOUNT_TYPE + " = ?) AND (" 
           + Calendars.OWNER_ACCOUNT + " = ?))"; 
     String[] selectionArgs = new String[] {"[email protected]", "com.google", 
       "[email protected]"}; 
     // Submit the query and get a Cursor object back. 
     cursor = cr.query(uri, EVENT_PROJECTION, selection, selectionArgs, null); 

     return cursor; 
    } 

    public void addEvent(Cursor cursor, String type, String location, String description, Date workout_date) { 

     System.err.println("adding event"); 

     while (cursor.moveToNext()) { 

      String displayName = null; 
      String accountName = null; 
      String ownerName = null; 

      // Get the field values 
      long calID = 0; 
      calID = cursor.getLong(PROJECTION_ID_INDEX); 
      displayName = cursor.getString(PROJECTION_DISPLAY_NAME_INDEX); 
      accountName = cursor.getString(PROJECTION_ACCOUNT_NAME_INDEX); 
      ownerName = cursor.getString(PROJECTION_OWNER_ACCOUNT_INDEX); 

      System.err.printf("Calendar: %s\n", displayName); 

      long startMillis = 0; 
      long endMillis = 0;  
      Calendar beginTime = Calendar.getInstance(); 
      beginTime.set(2014, 1, 26, 7, 30); 
      startMillis = beginTime.getTimeInMillis(); 
      Calendar endTime = Calendar.getInstance(); 
      endTime.set(2014, 1, 26, 8, 45); 
      endMillis = endTime.getTimeInMillis(); 

      ContentResolver cr = context.getContentResolver(); 
      ContentValues values = new ContentValues(); 
      values.put(Events.DTSTART, startMillis); 
      values.put(Events.DTEND, endMillis); 
      values.put(Events.TITLE, type); 
      values.put(Events.EVENT_LOCATION, location); 
      values.put(Events.DESCRIPTION, description); 
      values.put(Events.CALENDAR_ID, calID); 
      values.put(Events.EVENT_TIMEZONE, "America/Los_Angeles"); 

      cr.insert(Events.CONTENT_URI, values); 
     } 
    } 
} 

大部分是從http://developer.android.com/guide/topics/providers/calendar-provider.html拉到一起,但它只是不工作。除了我提到的警告之外,除了日曆上沒有任何內容顯示的小細節之外,它全部「顯現」起作用。

如何以通用方式編寫getCalendars()查詢以獲取可能位於用戶設備上的所有日曆?現在,你可以看到我仍然有來自android網站的語言。

任何幫助表示讚賞。謝謝。

編輯:安德魯T指出,由於月份是基於零的,所以我將硬編碼日期更改爲月份0.我還在while循環後添加了cursor.close()。不過,我的日曆上還沒有任何東西。

我注意到的一件事是我沒有進入while循環。所以我拿出了循環。當我將calID變量硬編碼爲1時,我終於得到了一個日曆條目,但這引起了我的關注。我認爲獲取日曆的重點是用戶可能在其設備上使用多個日曆,並且光標是遍歷每個日曆的方式。我錯了嗎?

如果將calID硬編碼爲1將解決我的問題,我很好,但我想確保我理解這一點,而不是依賴臨時解決方案。再次感謝!

回答

1

該警告是由插入事件後沒有關閉日曆Cursor引起的。致電cursor.close()關閉它。

另外,你是否在2月份檢查了事件?恐怕你在Java的Calendar工作月份有1個問題。 (月0,這是Calendar.JANUARY開始)

編輯:

似乎有與getCalendars()一個問題,特別是在String selection = ...返回空Cursor。另外,通過這種方法,事件可能會被添加到多個日曆中,這可能不是所期望的。

我的想法是創建一個ListActivity列出所有日曆讓用戶選擇他想使用的日曆。藉此,您還可以將日曆ID保存到SharedPreference,並在創建活動時方便地使用它。

我想你可以使用cursor = cr.query(uri, EVENT_PROJECTION, null, null, null);列出設備上的所有日曆。

+0

謝謝。你說的都對。我不認爲這些月份是否爲零。我想出瞭如何讓事件出現在我的日曆上,但我不相信我的方法對於所有情況都足夠強大。我編輯我的OP來解釋我的改變。你對我的編輯有什麼看法?感謝您的想法。很有幫助。 – Alex

+0

我在編輯時添加了一些信息。 –

+0

有關更改查詢參數的重要建議。對這兩個使用null解決了這個問題。你是對的,我需要想出一種方法來允許用戶從他們的日曆列表中進行選擇。謝謝你的幫助! – Alex

相關問題