2

I am trying to add an event to android calender my code works fine on older version devices (Android 2.3). But the same code gives the "Only the provider may write to calendar_timezone" error when trying to run in newer android devices(Android 4.1)

Note: I dont want to Use latest calender API to add events , as this apis are available for devices having android builds >=14

Below is the detail log of the error

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.calenderwithreminder/com.example.calenderwithreminder.MainActivity}: java.lang.IllegalArgumentException: Only the provider may write to calendar_timezone
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
android.app.ActivityThread.access$600(ActivityThread.java:141)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:137)
android.app.ActivityThread.main(ActivityThread.java:5103)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:525)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(25325): Caused by: java.lang.IllegalArgumentException: Only the provider may write to calendar_timezone
android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
android.content.ContentProviderProxy.insert(ContentProviderNative.java:440)
android.content.ContentResolver.insert(ContentResolver.java:914)
com.example.calenderwithreminder.MainActivity.onCreate(MainActivity.java:77)
android.app.Activity.performCreate(Activity.java:5133)
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
08-08 17:42:05.308: E/AndroidRuntime(25325):    ... 11 more

my code to add events are as follows

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    /*
    * A device may have more than one Calendar configure in it. So first,
    * you must find out available calendar's name and their id.
     */
    Cursor cursor = getContentResolver() .query(getCalendarURI(false),new String[] { "_id" }, null,null, null);
    cursor.moveToFirst();
    // fetching calendars name
    String CNames[] = new String[cursor.getCount()];
    // fetching calendars id
    int[] CalIds = new int[cursor.getCount()];
    for (int i = 0; i < CNames.length; i++) {
        CalIds[i] = cursor.getInt(0);
        cursor.moveToNext();
    }
    Log.e("test","total calenders ="+CalIds.length);
    Log.e("test","using calnder id "+CalIds[0]);

    // get calendar
    Calendar cal = Calendar.getInstance();     
    Uri EVENTS_URI = getCalendarURI(true);
    ContentResolver cr = getContentResolver();

    // event insert
    Cursor cursor11 = getContentResolver() .query(getCalendarURI(true),null, null,null, null);
    cursor11.moveToFirst();

    int colCount =cursor11.getColumnCount();
    for(int i=0;i<colCount;i++)
    {
        Log.e("test","--"+cursor11.getColumnName(i));
    }

    ContentValues values = new ContentValues();
    values.put("calendar_id",CalIds[0]);
    values.put("title", "Testing Reminder");
    values.put("allDay", 0);
    values.put("dtstart", cal.getTimeInMillis() + 11*60*1000); // event starts at 11 minutes from now
    values.put("dtend", cal.getTimeInMillis()+60*60*1000); // ends 60 minutes from now
    values.put("description", "Testing Reminder description");
    //Event Id
    // values.put("_id", scheduleId);  
    //0~ default; 1~ confidential; 2~ private; 3~ public
    values.put("visibility", 0);
    //0~ false; 1~ true
    values.put("hasAlarm", 1);
    //status: 0~ tentative; 1~ confirmed; 2~ canceled
    values.put("eventStatus", 1);
    //0~ opaque, no timing conflict is allowed; 1~ transparency, allow overlap of scheduling
    values.put("transparency", 0);
    if(Build.VERSION.SDK_INT >= 14)
    {
        java.util.TimeZone timeZone = java.util.TimeZone.getDefault(); //timeZone.getID() //"America/Los_Angeles"
        values.put("calendar_timezone", timeZone.getID());
    }

    Uri event = cr.insert(EVENTS_URI, values);
    Toast.makeText(getApplicationContext(), "Event Added successfully", Toast.LENGTH_LONG).show();

    // reminder insert
    Uri REMINDERS_URI = getReminderURI();
    values = new ContentValues();
    values.put( "event_id", Long.parseLong(event.getLastPathSegment()));
    values.put( "method", 1 );
    values.put( "minutes", 24*60 );
    cr.insert( REMINDERS_URI, values );
    Toast.makeText(getApplicationContext(), "Reminder Added successfully", Toast.LENGTH_LONG).show();


    Cursor cursor1 = getContentResolver() .query(getReminderURI(),null, null,null, null);
    cursor1.moveToFirst();
    int colCount1 = cursor1.getColumnCount();
    for(int i=0;i<colCount1;i++)
    {
        Log.e("test","reminder "+cursor1.getColumnName(i)+"---"+i);

    }

}

public void deleteEvent(Uri eventUri)
{
     // for deleting event
     // getContentResolver().delete(path to the content, want to delete,
     // CONDITION, ARGUMENTS);
            // CONDITION + ARGUMENTS work as where condition to find a particular
     /*event. 
      getContentResolver().delete(
        Uri.parse(getCalendarUriBase(this)),
        "calendar_id=? and description=? and eventLocation=? ",
        new String[] { String.valueOf(CalIds[0]), "Birthday Party",
          "Delhi" });*/

}

private Uri getCalendarURI( boolean eventUri){
    Uri calendarURI = null;

        if (android.os.Build.VERSION.SDK_INT <= 7 )
        {
             calendarURI = (eventUri)?Uri.parse("content://calendar/events"):Uri.parse("content://calendar/calendars");
        }
        else
            {
            calendarURI = (eventUri)?Uri.parse("content://com.android.calendar/events"): Uri.parse("content://com.android.calendar/calendars");
        } 
     return calendarURI; 
}

private Uri getReminderURI(){
    Uri reminderURI = null;
        if (android.os.Build.VERSION.SDK_INT <= 7 )
        {
            reminderURI = Uri.parse("content://calendar/reminders");
        }
        else
            {
            reminderURI = Uri.parse("content://com.android.calendar/reminders");
        } 
     return reminderURI; 

}

}

chandan
  • 2,400
  • 2
  • 18
  • 23

1 Answers1

0

The "calendar_timezone" should not be added for inserting a reminder. This causes the exception.

Try with "event_timezone".