2013-04-15 149 views
6

我试图通过日历意图添加事件。但是,我无法弄清楚如何获取刚刚添加的事件的事件ID。Android使用意图将事件添加到日历,获取EventID

 Intent intent = new Intent(Intent.ACTION_EDIT); 
     intent.setType("vnd.android.cursor.item/event"); 
     intent.putExtra("beginTime", sdate.getTime()); 
     intent.putExtra("endTime", edate.getTime()); 
     intent.putExtra("allDay", true); 
     intent.putExtra("rrule", "FREQ=YEARLY"); 
     intent.putExtra("title", "A Test Event from android app"); 
     intent.putExtra("description", "Description here"); 
     intent.putExtra("eventLocation", "location here here here"); 

我在其他资源的广泛阅读,似乎无法找到答案。我试过startActivityForResult,但我似乎无法得到它的工作。我尝试的其他方法似乎无法检查,直到活动结束。

事件添加到日历后是否有任何其他方式获取事件ID?我需要为此使用intent方法。

回答

6

试试这个解决方案:

import android.content.ContentResolver; 
import android.content.ContentValues; 
import android.net.Uri; 

public class CalenderUtils { 

/** 
* Add a new event into a native Google calendar. Add alert notification by setting <code>isRemind</code> as <code>true</code>. 
* @param cr - ContentResolver 
* @param title - Event title 
* @param addInfo - Event description 
* @param place - Event place 
* @param status - <code>int</code> This information is sufficient for most entries: tentative (0), confirmed (1) or canceled (2): 
* @param startDate - <code>long</code> event start time in mls 
* @param isRemind - <code>boolean</code> need to remind about event before? 
* @param isMailService - <code>boolean</code>. Adding attendees to the meeting 
* @return <code>long</code> eventID 
*/ 
public static long addEventToCalender(ContentResolver cr, String title, String addInfo, String place, int status, 
     long startDate, boolean isRemind, boolean isMailService) { 
    String eventUriStr = "content://com.android.calendar/events"; 
    ContentValues event = new ContentValues(); 
    // id, We need to choose from our mobile for primary its 1 
    event.put("calendar_id", 1); 
    event.put("title", title); 
    event.put("description", addInfo); 
    event.put("eventLocation", place); 
    event.put("eventTimezone", "UTC/GMT +2:00"); 

    // For next 1hr 
    long endDate = startDate + 1000 * 60 * 60; 
    event.put("dtstart", startDate); 
    event.put("dtend", endDate); 
    //If it is bithday alarm or such kind (which should remind me for whole day) 0 for false, 1 for true 
    // values.put("allDay", 1); 
    event.put("eventStatus", status); 
    event.put("hasAlarm", 1); 

    Uri eventUri = cr.insert(Uri.parse(eventUriStr), event); 
    long eventID = Long.parseLong(eventUri.getLastPathSegment()); 

    if (isRemind) { 
     String reminderUriString = "content://com.android.calendar/reminders"; 
     ContentValues reminderValues = new ContentValues(); 
     reminderValues.put("event_id", eventID); 
     // Default value of the system. Minutes is a integer 
     reminderValues.put("minutes", 5); 
     // Alert Methods: Default(0), Alert(1), Email(2), SMS(3) 
     reminderValues.put("method", 1); 
     cr.insert(Uri.parse(reminderUriString), reminderValues); //Uri reminderUri = 
    } 
    if (isMailService) { 
     String attendeuesesUriString = "content://com.android.calendar/attendees"; 
     /********* To add multiple attendees need to insert ContentValues multiple times ***********/ 
     ContentValues attendeesValues = new ContentValues(); 
     attendeesValues.put("event_id", eventID); 
     // Attendees name 
     attendeesValues.put("attendeeName", "xxxxx"); 
     // Attendee email 
     attendeesValues.put("attendeeEmail", "[email protected]"); 
     // Relationship_Attendee(1), Relationship_None(0), Organizer(2), Performer(3), Speaker(4) 
     attendeesValues.put("attendeeRelationship", 0); 
     // None(0), Optional(1), Required(2), Resource(3) 
     attendeesValues.put("attendeeType", 0); 
     // None(0), Accepted(1), Decline(2), Invited(3), Tentative(4) 
     attendeesValues.put("attendeeStatus", 0); 
     cr.insert(Uri.parse(attendeuesesUriString), attendeesValues); //Uri attendeuesesUri = 
    } 

    return eventID; 
} 

} 

所以欢迎您根据自己的喜好来更改名字,我copypasted从我的项目这个类。 正如你在这里注意到的,你在插入后会收到id的值。

如果你需要得到reminderId或参加会议id - 你必须处理来自cr.insert...返回值,然后parce URI long id = Long.parseLong(uri.getLastPathSegment());

这是一个额外的信息:CalendarContract.EventsCalendar chapter

+0

谢谢,它已经长因为我解决了这个问题,但是这似乎也起作用了! – kotsumu

+0

@kotsumu你能否详细说明你的解决方案?我也有这个问题。除非用户取消插入,否则不会调用“onactivityResult”方法。我不能使用这里提出的那个,因为我需要支持姜饼。 –

+1

我是否错过了使用意图生成日历事件的部分?我相信那是个问题。 – eimmer

相关问题