Search code examples
androidcalendarandroid-contentproviderandroid-calendar

Cannot insert a new Calendar because of IllegalArgumentException in content values


I want to insert a local calendar in CalendarProvider. Here is what I do:

Uri uri = asSyncAdapter(CalendarContract.Calendars.CONTENT_URI, "Test", CalendarContract.ACCOUNT_TYPE_LOCAL);

        ContentValues values = new ContentValues();

        values.put(CalendarContract.Calendars.NAME, "Test");
        values.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, "Test Calendar (Added Programmatically)");
        values.put(CalendarContract.Calendars.CALENDAR_COLOR, 0x00FF00);
        values.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER);
        values.put(CalendarContract.Calendars.OWNER_ACCOUNT, "Test");

Uri insertUri = getContentResolver().insert(uri, values);

This method is copied from developer:

static Uri asSyncAdapter(Uri uri, String account, String accountType) {
    return uri.buildUpon()
            .appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER, "true")
            .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, account)
            .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, accountType).build();
}

However I have put value for name column, I get a similar exception:

java.lang.IllegalArgumentException: the name must not be empty: null

How can I fix that?


Solution

  • I found the problem. I must explicitly put value for account name and account type:

    values.put(CalendarContract.Calendars.ACCOUNT_NAME, "Test");
    values.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);