如何在Android中添加日历事件?

我只是在加快Android的速度,今天在一个项目会议上有人说,Android没有本机日历应用程序,所以用户只需使用他们喜欢的任何日历应用程序。

这是真的,如果是这样,我怎么编程添加一个事件到用户的日历? 他们都有共同的API吗?

对于它的价值,我们可能是针对Android 2.x.

我如何以编程方式将事件添加到用户的日历?

哪个日历?

他们都有共同的API吗?

不,只有Windows日历应用程序有一个“共同的API”。 有一些常见的数据格式(如iCalendar)和Internet协议(如CalDAV),但没有通用的API。 一些日历应用程序甚至不提供API。

如果您想要集成特定的日历应用程序,请联系他们的开发人员,并确定他们是否提供API。 因此,例如,Mayra引用的来自Android开放源代码项目的Calendar应用程序没有提供记录和支持的API。 Google甚至明确地告诉开发者不要使用 Mayra引用的教程中概述的技术 。

另一种选择是您将事件添加到Internet日历中。 例如,从Android开放源代码项目向日历应用程序添加事件的最佳方式是通过相应的GData API将事件添加到用户的Google日历。


UPDATE

Android 4.0(API Level 14)添加了一个CalendarContract ContentProvider

在你的代码中试试这个:

 Calendar cal = Calendar.getInstance(); Intent intent = new Intent(Intent.ACTION_EDIT); intent.setType("vnd.android.cursor.item/event"); intent.putExtra("beginTime", cal.getTimeInMillis()); intent.putExtra("allDay", true); intent.putExtra("rrule", "FREQ=YEARLY"); intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000); intent.putExtra("title", "A Test Event from android app"); startActivity(intent); 

添加权限

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"...> <uses-sdk android:minSdkVersion="14" /> <uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.WRITE_CALENDAR" /> ... </manifest> 

在你的代码中使用这个API ..它将帮助你插入事件,事件提醒和事件会议可以启用…这个API适用于平台2.1及以上那些谁使用少于2.1而不是内容:/ / COM .android.calendar / events使用内容://日历/事件

  public static long pushAppointmentsToCalender(Activity curActivity, String title, String addInfo, String place, int status, long startDate, boolean needReminder, boolean needMailService) { /***************** Event: note(without alert) *******************/ String eventUriString = "content://com.android.calendar/events"; ContentValues eventValues = new ContentValues(); eventValues.put("calendar_id", 1); // id, We need to choose from // our mobile for primary // its 1 eventValues.put("title", title); eventValues.put("description", addInfo); eventValues.put("eventLocation", place); long endDate = startDate + 1000 * 60 * 60; // For next 1hr eventValues.put("dtstart", startDate); eventValues.put("dtend", endDate); // values.put("allDay", 1); //If it is bithday alarm or such // kind (which should remind me for whole day) 0 for false, 1 // for true eventValues.put("eventStatus", status); // This information is // sufficient for most // entries tentative (0), // confirmed (1) or canceled // (2): eventValues.put("eventTimezone", "UTC/GMT +2:00"); /*Comment below visibility and transparency column to avoid java.lang.IllegalArgumentException column visibility is invalid error */ /*eventValues.put("visibility", 3); // visibility to default (0), // confidential (1), private // (2), or public (3): eventValues.put("transparency", 0); // You can control whether // an event consumes time // opaque (0) or transparent // (1). */ eventValues.put("hasAlarm", 1); // 0 for false, 1 for true Uri eventUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(eventUriString), eventValues); long eventID = Long.parseLong(eventUri.getLastPathSegment()); if (needReminder) { /***************** Event: Reminder(with alert) Adding reminder to event *******************/ String reminderUriString = "content://com.android.calendar/reminders"; ContentValues reminderValues = new ContentValues(); reminderValues.put("event_id", eventID); reminderValues.put("minutes", 5); // Default value of the // system. Minutes is a // integer reminderValues.put("method", 1); // Alert Methods: Default(0), // Alert(1), Email(2), // SMS(3) Uri reminderUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(reminderUriString), reminderValues); } /***************** Event: Meeting(without alert) Adding Attendies to the meeting *******************/ if (needMailService) { 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); attendeesValues.put("attendeeName", "xxxxx"); // Attendees name attendeesValues.put("attendeeEmail", "yyyy@gmail.com");// Attendee // E // mail // id attendeesValues.put("attendeeRelationship", 0); // Relationship_Attendee(1), // Relationship_None(0), // Organizer(2), // Performer(3), // Speaker(4) attendeesValues.put("attendeeType", 0); // None(0), Optional(1), // Required(2), Resource(3) attendeesValues.put("attendeeStatus", 0); // NOne(0), Accepted(1), // Decline(2), // Invited(3), // Tentative(4) Uri attendeuesesUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(attendeuesesUriString), attendeesValues); } return eventID; } 

我使用下面的代码,它解决了我的问题添加事件在ICS中的默认设备日历,也在ICS的版本

  if (Build.VERSION.SDK_INT >= 14) { Intent intent = new Intent(Intent.ACTION_INSERT) .setData(Events.CONTENT_URI) .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis()) .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis()) .putExtra(Events.TITLE, "Yoga") .putExtra(Events.DESCRIPTION, "Group class") .putExtra(Events.EVENT_LOCATION, "The gym") .putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY) .putExtra(Intent.EXTRA_EMAIL, "rowan@example.com,trevor@example.com"); startActivity(intent); } else { Calendar cal = Calendar.getInstance(); Intent intent = new Intent(Intent.ACTION_EDIT); intent.setType("vnd.android.cursor.item/event"); intent.putExtra("beginTime", cal.getTimeInMillis()); intent.putExtra("allDay", true); intent.putExtra("rrule", "FREQ=YEARLY"); intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000); intent.putExtra("title", "A Test Event from android app"); startActivity(intent); } 

希望它会帮助…..

从Android版本4.0开始, 官方API和意图可用于与可用的日历提供程序进行交互。

Google日历是“本机”日历应用程序。 据我所知,所有的手机都带有一个安装的版本,默认的SDK提供了一个版本。

你可以看看这个教程的工作。

尝试这个 ,

  Calendar beginTime = Calendar.getInstance(); beginTime.set(yearInt, monthInt - 1, dayInt, 7, 30); ContentValues l_event = new ContentValues(); l_event.put("calendar_id", CalIds[0]); l_event.put("title", "event"); l_event.put("description", "This is test event"); l_event.put("eventLocation", "School"); l_event.put("dtstart", beginTime.getTimeInMillis()); l_event.put("dtend", beginTime.getTimeInMillis()); l_event.put("allDay", 0); l_event.put("rrule", "FREQ=YEARLY"); // status: 0~ tentative; 1~ confirmed; 2~ canceled // l_event.put("eventStatus", 1); l_event.put("eventTimezone", "India"); Uri l_eventUri; if (Build.VERSION.SDK_INT >= 8) { l_eventUri = Uri.parse("content://com.android.calendar/events"); } else { l_eventUri = Uri.parse("content://calendar/events"); } Uri l_uri = MainActivity.this.getContentResolver() .insert(l_eventUri, l_event); 

以防万一,如果有人需要这个Xamarin在C#中:

  Intent intent = new Intent(Intent.ActionInsert); intent.SetData(Android.Provider.CalendarContract.Events.ContentUri); intent.PutExtra(Android.Provider.CalendarContract.ExtraEventBeginTime, Utils.Tools.CurrentTimeMillis(game.Date)); intent.PutExtra(Android.Provider.CalendarContract.EventsColumns.AllDay, false); intent.PutExtra(Android.Provider.CalendarContract.EventsColumns.EventLocation, "Location"); intent.PutExtra(Android.Provider.CalendarContract.EventsColumns.Description, "Description"); intent.PutExtra(Android.Provider.CalendarContract.ExtraEventEndTime, Utils.Tools.CurrentTimeMillis(game.Date.AddHours(2))); intent.PutExtra(Android.Provider.CalendarContract.EventsColumns.Title, "Title"); StartActivity(intent); 

助手功能:

  private static readonly DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); public static long CurrentTimeMillis(DateTime date) { return (long)(date.ToUniversalTime() - Jan1st1970).TotalMilliseconds; } 

如果您有给定的日期字符串与日期和时间。

例如String givenDateString = pojoModel.getDate()/* Format dd-MMM-yyyy hh:mm:ss */

使用下面的代码将日期和时间的事件添加到日历

 Calendar cal = Calendar.getInstance(); cal.setTime(new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss").parse(givenDateString)); Intent intent = new Intent(Intent.ACTION_EDIT); intent.setType("vnd.android.cursor.item/event"); intent.putExtra("beginTime", cal.getTimeInMillis()); intent.putExtra("allDay", false); intent.putExtra("rrule", "FREQ=YEARLY"); intent.putExtra("endTime",cal.getTimeInMillis() + 60 * 60 * 1000); intent.putExtra("title", " Test Title"); startActivity(intent); 

你必须添加标志:

 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

否则会导致错误:

来自Activity上下文之外的startActivity()需要FLAG_ACTIVITY_NEW_TASK