How to add calendar events in Android?

AndroidCalendar

Android Problem Overview


I'm just getting up to speed on Android, and today in a project meeting someone said that Android has no native calendar app so users just use whatever calendar app they like.

Is this true, and if so how do I programmatically add an event to the user's calendar? Is there a common API they all share?

For what it's worth, we're probably targeting Android 2.x.

Android Solutions


Solution 1 - Android

Try this in your code:

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);

Solution 2 - Android

Use this API in your code.. It will help u to insert event, event with reminder and event with meeting can be enabled... This api works for platform 2.1 and above Those who uses less then 2.1 instead of content://com.android.calendar/events use content://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", "[email protected]");// 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;

}

Solution 3 - Android

i used the code below, it solves my problem to add event in default device calendar in ICS and also on version less that 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, "[email protected],[email protected]");
         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);
        }

Hope it would help.....

Solution 4 - Android

As of Android version 4.0 official APIs and intents are available to interact with the available calendar providers.

Solution 5 - Android

> how do I programmatically add an event to the user's calendar?

Which calendar?

> Is there a common API they all share?

No, no more than there is a "common API they all share" for Windows calendar apps. There are some common data formats (e.g., iCalendar) and Internet protocols (e.g., CalDAV), but no common API. Some calendar apps don't even offer an API.

If there are specific calendar applications you wish to integrate with, contact their developers and determine if they offer an API. So, for example, the Calendar application from the Android open source project, that Mayra cites, offers no documented and supported APIs. Google has even explicitly told developers to not use the techniques outlined in the tutorial Mayra cites.

Another option is for you to add events to the Internet calendar in question. For example, the best way to add events to the Calendar application from the Android open source project is to add the event to the user's Google Calendar via the appropriate GData APIs.


UPDATE

Android 4.0 (API Level 14) added a CalendarContract ContentProvider.

Solution 6 - Android

Try this ,

   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);

Solution 7 - Android

Just in case if someone needs this for Xamarin in 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);

Helper Functions:

    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;
    }

Solution 8 - Android

Google calendar is the "native" calendar app. As far as I know, all phones come with a version of it installed, and the default SDK provides a version.

You might check out this tutorial for working with it.

Solution 9 - Android

if you have a given Date string with date and time .

for e.g String givenDateString = pojoModel.getDate()/* Format dd-MMM-yyyy hh:mm:ss */

use the following code to add an event with date and time to the calendar

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);

Solution 10 - Android

you have to add flag:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

or you will cause error with:

startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK

Solution 11 - Android

Here is the Kotlin version for adding event to calendar :

            val intent = Intent(Intent.ACTION_EDIT)
            intent.type = "vnd.android.cursor.item/event"
            intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startTime)
            intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime)
            intent.putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, false)
            intent.putExtra(CalendarContract.Events.TITLE, mTitle)
            startActivity(intent)

Solution 12 - Android

Android provides mainly two approaches to work on calendar events. One is using Calendar Provider and the other one is handing off it to the system Calendar app.

Calendar Provider provides us all the functionalities, including inserting, querying, updating and deleting existing calendar events. However, the steps are tedious and must require user’s runtime permissions (android.permission.READ_CALENDAR and android.permission.WRITE_CALENDAR) to read and write the sensitive calendar information. It is easy to make a mistake with this approach.

enter image description here

Google officially recommends developers use the second approach, i.e. handing off all the calendar operations to the system Calendar app by using Intent. The calendar app is opened right after requested by our app

Inserting new calendar even

    val startMillis: Long = Calendar.getInstance().run {
    set(2012, 0, 19, 7, 30)
    timeInMillis
}
val endMillis: Long = Calendar.getInstance().run {
    set(2012, 0, 19, 8, 30)
    timeInMillis
}
val intent = Intent(Intent.ACTION_INSERT)
        .setData(CalendarContract.Events.CONTENT_URI)
        .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startMillis)
        .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endMillis)
        .putExtra(CalendarContract.Events.TITLE, "Yoga")
        .putExtra(CalendarContract.Events.DESCRIPTION, "Group class")
        .putExtra(CalendarContract.Events.EVENT_LOCATION, "The gym")
        .putExtra(CalendarContract.Events.AVAILABILITY, CalendarContract.Events.AVAILABILITY_BUSY)
        .putExtra(Intent.EXTRA_EMAIL, "[email protected],[email protected]")
startActivity(intent)

Following activity is opend

enter image description here

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPeter NelsonView Question on Stackoverflow
Solution 1 - AndroidoriharelView Answer on Stackoverflow
Solution 2 - AndroidPradeepView Answer on Stackoverflow
Solution 3 - AndroidMilan ShuklaView Answer on Stackoverflow
Solution 4 - AndroidtobsenView Answer on Stackoverflow
Solution 5 - AndroidCommonsWareView Answer on Stackoverflow
Solution 6 - AndroidArun AntoneyView Answer on Stackoverflow
Solution 7 - AndroiddotsaView Answer on Stackoverflow
Solution 8 - AndroidCheryl SimonView Answer on Stackoverflow
Solution 9 - AndroidArunView Answer on Stackoverflow
Solution 10 - Androidjohn vuongView Answer on Stackoverflow
Solution 11 - AndroidMahdi GiveieView Answer on Stackoverflow
Solution 12 - AndroidRahul DevanavarView Answer on Stackoverflow