我正在嘗試編寫一個類,以將事件添加到用戶的日曆中(不使用意圖)。我需要最終能夠在一個循環中添加多達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將解決我的問題,我很好,但我想確保我理解這一點,而不是依賴臨時解決方案。再次感謝!
謝謝。你說的都對。我不認爲這些月份是否爲零。我想出瞭如何讓事件出現在我的日曆上,但我不相信我的方法對於所有情況都足夠強大。我編輯我的OP來解釋我的改變。你對我的編輯有什麼看法?感謝您的想法。很有幫助。 – Alex
我在編輯時添加了一些信息。 –
有關更改查詢參數的重要建議。對這兩個使用null解決了這個問題。你是對的,我需要想出一種方法來允許用戶從他們的日曆列表中進行選擇。謝謝你的幫助! – Alex