Read and write Calendar

2019-04-12 02:26发布

问题:

My objective is to read and write Calendar.

i am able to read data from the content://calendar/calendars and content://calendar/events

String uriString = "content://calendar/calendars";
  Log.i("INFO", "Reading content from " + uriString);
  readContent(uriString);
  uriString = "content://calendar/events";
  Log.i("INFO", "Reading content from " + uriString);
  readContent(uriString);

private void readContent(String uriString) {

  Uri uri = Uri.parse(uriString);
  Cursor cursor = mContext.getContentResolver().query(uri, null, null,
    null, null);
  if (cursor != null && cursor.getCount() > 0) {
   cursor.moveToFirst();
   String columnNames[] = cursor.getColumnNames();
   String value = "";
   String colNamesString = "";
   do {
    value = "";

    for (String colName : columnNames) {
     value += colName + " = ";
     value += cursor.getString(cursor.getColumnIndex(colName))
       + " ||";
    }

    Log.e("INFO : ", value);
   } while (cursor.moveToNext());

  }

 }

i am also inserting new record in the calendar like :

String calUriString = "content://calendar/calendars";
   ContentValues values = new ContentValues();
   values.put("name", "Code Generate Calendar");
   values.put("displayName", "Code Generate Calendar");
   values.put("hidden", 0);
   values.put("color", "-7581685");
   values.put("access_level", "700");
   values.put("selected", "1");
   values.put("timezone", "Asia/Karachi");

   Uri calendarUri = context.getContentResolver().insert(
   Uri.parse(calUriString), values);

but it is not appearing in the Calendar.

when i going to insert new events in Calendar like :

   ContentValues values = new ContentValues();
   values.put("calendar_id", 4);
   values.put("dtend", "1277337600000");
   values.put("dtstart", "1277251200000");
   // values.put("title", "first TEst event");
   values.put("transparency", 1);
   values.put("selected", 1);
   values.put("color", "-16380578");
   // values.put("lastDate", "6/25/2010");
   //values.put("access_level", 700);
   values.put("eventStatus", 1);
   values.put("eventTimezone", "UTC");
   values.put("timezone", "Asia/Karachi");
   values.put("allDay", 1);
   String eventUriString = "content://calendar/events";
   Uri eventUri = context.getContentResolver().insert(
   Uri.parse(eventUriString), values);

throwing exception that column is invalid.

how this possible. Thanks

回答1:

The calendar content provider is not part of the Android SDK. It has changed between Android releases before and will do so again. It may not work on some devices where they have replaced the default calendar application with their own.

Do not use undocumented content providers.

The solution is the same as the question you asked 32 minutes previously -- use the Google Calendar GData APIs to manipulate the user's calendar.



回答2:

// To insert event to the calender for android 2.2 and above if less then 2.2 instead of content://com.android.calendar write content://calendar

String calUriString = "content://com.android.calendar/events";
            ContentValues values = new ContentValues();

values.put("calendar_id",2); //id, We need to choose from our mobile for primary its 1
values.put("title", "Birthday");
values.put("description", "Go home at 2pm");
values.put("eventLocation", "Home");
long startTime = System.currentTimeMillis() + 1000 * 60 * 60*24; // Next day

values.put("dtstart", startTime);
values.put("dtend", startTime);

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

values.put("eventStatus", 1); // This information is sufficient for most entries tentative (0), confirmed (1) or canceled (2):

values.put("visibility", 3); // visibility to default (0), confidential (1), private (2), or public (3):

values.put("transparency", 0); // You can control whether an event consumes time  opaque (0) or transparent (1).

values.put("hasAlarm", 1); // 0 for false, 1 for true


Uri calendarUri = getApplicationContext().getContentResolver().insert(Uri.parse(calUriString), values);


回答3:

Dates have been passed since the first question. And today it seems like calendar content provider is well documented. (Maybe since API 14?)

For the short answer to the exception is the difference of the type you give to the column and the type expected. (long expected for dtstart instead of String)

http://developer.android.com/reference/android/provider/CalendarContract.EventsColumns.html#DTSTART

For more information, there is another resource on developer.android.com: http://developer.android.com/guide/topics/providers/calendar-provider.html