'Error Inserting Event into Calendar with Intent

I'm trying to insert events to the calendar from a fragment, but I keep getting an error that no activity is found to handle Intent.

Here's the error -

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.INSERT cat=[android.intent.category.APP_CALENDAR] typ=vnd.android.cursor.item/event (has extras) }

Here's my code:

Intent intent = new Intent(Intent.ACTION_INSERT);
intent.addCategory(Intent.CATEGORY_APP_CALENDAR);
intent.setType("vnd.android.cursor.item/event");
intent.putExtra(Events.TITLE, "Phototherapy Treatment");
intent.putExtra(Events.EVENT_LOCATION, "");
intent.putExtra(Events.DESCRIPTION, "Phototherapy Treatment");

// Setting dates
Calendar calDate = Calendar.getInstance();
intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME,calDate.getTimeInMillis());
intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME,
calDate.getTimeInMillis()+60*60*1000);

// Make it a full day event
intent.putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, false);

// Make it a recurring Event                    
intent.putExtra(Events.RRULE, "FREQ=WEEKLY;COUNT="+Integer.valueOf(No.getText().toString())+";"
+"WKST=SU;BYDAY="+days);

// Making it private and shown as busy
 intent.putExtra(Events.ACCESS_LEVEL, Events.ACCESS_PRIVATE);
 intent.putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY);

startActivity(intent);

Intent Filter

<intent-filter> 
<action android:name="android.intent.action.MAIN" /> 
<action android:name="android.intent.action.INSERT" /> 
<category android:name="android.intent.category.APP_CALENDAR" /> 
<data android:mimeType="vnd.android.cursor.item/event" /> 
</intent-filter>


Solution 1:[1]

I used Intent intent = new Intent(Intent.ACTION_EDIT); and it seemed to resolve the issue

Solution 2:[2]

Calender App may not be installed in some devices. So enclose within try catch block to check.

Calendar startTymVar = Calendar.getInstance();
startTymVar.set(2015, 12, 31, 11, 30);

Intent calendarIntentVar = new Intent(Intent.ACTION_INSERT)
            .setData(CalendarContract.Events.CONTENT_URI)
            .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startTymVar.getTimeInMillis())
            .putExtra(CalendarContract.Events.TITLE, "New Year")
            .putExtra(CalendarContract.Events.DESCRIPTION, "Hav ful fun");

try
{
    startActivity(calendarIntentVar);
}
catch (ActivityNotFoundException ErrVar)
{
    Toast.makeText(this, "Install Calender App", Toast.LENGTH_LONG).show();
}

Solution 3:[3]

if you already know the information which it looks like you do you do not need to launch the calendar app, simply just insert the event into the database see adding events

Also looking at the docs APP_CALENDAR is only used with ACTION_MAIN not ACTION_INSERT

Solution 4:[4]

Check if there is any activity that resolves this intent

if (intent.resolveActivity(getPackageManager()) == null) {
}

Solution 5:[5]

This is relevant for Android 11 and above devices, that on the top of steps mentioned in Common Intents - Add Event, we have to add the intent in the <queries> block in the Android Manifest file.

Do note that adding an <intent-filter> on Activity which launches the calendar intent won't work as it adds that Activity as a receiver of such intents, but rather adding following snippet in manifest file does the trick:

<queries>
    <intent>
        <action android:name="android.intent.action.INSERT" />
        <data android:mimeType="vnd.android.cursor.dir/event" />
    </intent>
</queries>

For me this trick worked for my Android 11 device, and it was already working fine for devices before that!

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 MrEngineer13
Solution 2
Solution 3
Solution 4 ozmank
Solution 5 Dhanesh Katre