Android 4.0 (API level 14) introduced a supported API for accessing the Calendar Content Provider. The Calendar API allows you to insert, view, and edit the complete Calendar database, providing access to calendars, events, attendees, and event reminders using either Intents or through direct manipulation of the Calendar Content Providers. Like the Contacts Contract Content Provider, the Calendar Content Provider is designed to support multiple synchronized accounts. As a result, you can choose to read from, and contribute to, existing calendar applications and accounts; develop an alternative Calendar Provider by creating a calendar Sync Adapter; or create an alternative calendar application.
To access the Calendar Content Provider, you must include the READ_CALENDAR uses-permission in your application manifest:
Use the Content Resolver to query any of the Calendar Provider tables using their CONTENT_URI static constant. Each table is exposed from within the CalendarContract class, including:
1. Calendars — The Calendar application can display multiple calendars associated with multiple accounts. This table holds each calendar that can be displayed, as well as details such as the calendar’s display name, time zone, and color.
2. Events — The Events table includes an entry for each scheduled calendar event, including the name, description, location, and start/end times.
3.Instances — Each event has one or (in the case of recurring events) multiple instances. The Instances table is populated with entries generated by the contents of the Events table and includes a reference to the event that generated it.
4. Attendees — Each entry in the Attendees table represents a single attendee of a given event. Each attendee can include a name, email address, and attendance status, and if they are optional or required guests.
5. Reminders — Event reminders are represented within the Reminders table, with each row representing one reminder for a particular event.
The following code queries the Events table for every event, creating an array of strings that holds each event’s name and unique ID.
MainActivity.java
package com.example.queryeventtable; import android.annotation.SuppressLint; import android.app.Activity; import android.database.Cursor; import android.os.Bundle; import android.provider.CalendarContract; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.Toast; @SuppressLint("NewApi") public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button qry = (Button) findViewById(R.id.querybut); qry.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub query(); } }); } public void query() { String[] projection = { CalendarContract.Events._ID, CalendarContract.Events.TITLE }; // Get a Cursor over the Events Provider. Cursor cursor = getContentResolver().query( CalendarContract.Events.CONTENT_URI, projection, null, null, null); // Get the index of the columns. int nameIdx = cursor .getColumnIndexOrThrow(CalendarContract.Events.TITLE); int idIdx = cursor.getColumnIndexOrThrow(CalendarContract.Events._ID); // Initialize the result set. String[] result = new String[cursor.getCount()]; // Iterate over the result Cursor. while (cursor.moveToNext()) { // Extract the name. String name = cursor.getString(nameIdx); // Extract the unique ID. String id = cursor.getString(idIdx); result[cursor.getPosition()] = name + "(" + id + ")"; Toast.makeText(this, name + "(" + id + ")", Toast.LENGTH_SHORT) .show(); } // Close the Cursor. cursor.close(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
Activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:id="@+id/querybut" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginTop="166dp" android:text="Launch Query" /> </RelativeLayout>
AndoridManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.queryeventtable" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.READ_CALENDAR" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.queryeventtable.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>