कैलेंडर की सेवा देने वाली कंपनी के बारे में खास जानकारी

Calendar की सेवा देने वाली कंपनी, उपयोगकर्ता के कैलेंडर इवेंट का डेटा स्टोर करती है. Calendar Provider API की मदद से, कैलेंडर, इवेंट, मेहमानों, रिमाइंडर वगैरह के लिए क्वेरी की जा सकती है, उन्हें जोड़ा जा सकता है, अपडेट किया जा सकता है, और मिटाया जा सकता है.

Calendar Provider API का इस्तेमाल, ऐप्लिकेशन और सिंक एडेप्टर कर सकते हैं. कॉल करने वाले प्रोग्राम के हिसाब से, नियम अलग-अलग होते हैं. इस दस्तावेज़ में, Calendar Provider API को ऐप्लिकेशन के तौर पर इस्तेमाल करने पर मुख्य तौर पर फ़ोकस किया गया है. सिंक अडैप्टर के अलग-अलग होने के बारे में जानने के लिए, सिंक अडैप्टर लेख पढ़ें.

आम तौर पर, कैलेंडर डेटा को पढ़ने या उसमें डेटा सेव करने के लिए, ऐप्लिकेशन के मेनिफ़ेस्ट में उपयोगकर्ता की अनुमतियां में बताई गई सही अनुमतियां शामिल होनी चाहिए. सामान्य कार्रवाइयां आसानी से करने के लिए, Calendar Provider इंटेंट का एक सेट उपलब्ध कराता है. इस बारे में Calendar के इंटेंट में बताया गया है. इन इंटेंट की मदद से, उपयोगकर्ता Calendar ऐप्लिकेशन में जाकर इवेंट जोड़ सकते हैं, देख सकते हैं, और उनमें बदलाव कर सकते हैं. उपयोगकर्ता, Calendar ऐप्लिकेशन के साथ इंटरैक्ट करता है और फिर ओरिजनल ऐप्लिकेशन पर वापस आता है. इसलिए, आपके ऐप्लिकेशन को अनुमतियों का अनुरोध करने की ज़रूरत नहीं है. इसके अलावा, इवेंट देखने या बनाने के लिए, उसे यूज़र इंटरफ़ेस देने की ज़रूरत भी नहीं है.

बुनियादी जानकारी

कॉन्टेंट देने वाले डेटा स्टोर करते हैं और उसे ऐप्लिकेशन के लिए ऐक्सेस करने लायक बनाते हैं. Android प्लैटफ़ॉर्म (इसमें कैलेंडर की सेवा देने वाली कंपनी भी शामिल है) से कॉन्टेंट देने वाले लोग या कंपनियां, आम तौर पर डेटा को टेबल के एक सेट के तौर पर दिखाती हैं. ये टेबल, रिलेशनल डेटाबेस मॉडल पर आधारित होती हैं. इसमें हर पंक्ति एक रिकॉर्ड है और हर कॉलम, एक खास टाइप और मतलब का डेटा है. Calendar Provider API की मदद से, ऐप्लिकेशन और सिंक एडेप्टर को उन डेटाबेस टेबल का पढ़ने/लिखने का ऐक्सेस मिल सकता है जिनमें उपयोगकर्ता का कैलेंडर डेटा सेव होता है.

कॉन्टेंट उपलब्ध कराने वाली हर कंपनी, एक सार्वजनिक यूआरआई (Uri ऑब्जेक्ट के तौर पर रैप किया गया) दिखाती है. इससे, उसके डेटा सेट की खास पहचान होती है. ऐसा कॉन्टेंट देने वाला जो कई डेटा सेट (कई टेबल) को कंट्रोल करता है, वह हर सेट के लिए अलग-अलग यूआरआई दिखाता है. सेवा देने वाली कंपनियों के सभी यूआरआई, "content://" स्ट्रिंग से शुरू होते हैं. इससे, यह पता चलता है कि डेटा को कॉन्टेंट उपलब्ध कराने वाली कंपनी कंट्रोल करती है. Calendar Provider, अपनी हर क्लास (टेबल) के लिए यूआरआई के लिए कॉन्स्टेंट तय करता है. इन यूआरआई का फ़ॉर्मैट <class>.CONTENT_URI होता है. उदाहरण के लिए, Events.CONTENT_URI.

पहली इमेज में, कैलेंडर प्रोवाइडर के डेटा मॉडल को ग्राफ़िक के तौर पर दिखाया गया है. यह मुख्य टेबल और उन फ़ील्ड को दिखाता है जो उन्हें एक-दूसरे से जोड़ते हैं.

कैलेंडर की सेवा देने वाली कंपनी का डेटा मॉडल

पहली इमेज. कैलेंडर की सेवा देने वाली कंपनी का डेटा मॉडल.

एक उपयोगकर्ता के पास एक से ज़्यादा कैलेंडर हो सकते हैं. साथ ही, अलग-अलग कैलेंडर को अलग-अलग तरह के खातों (Google Calendar, Exchange वगैरह) से जोड़ा जा सकता है.

CalendarContract से कैलेंडर और इवेंट से जुड़ी जानकारी के डेटा मॉडल के बारे में पता चलता है. यह डेटा कई टेबल में सेव होता है. इन टेबल की सूची यहां दी गई है.

टेबल (क्लास) ब्यौरा

CalendarContract.Calendars

इस टेबल में कैलेंडर से जुड़ी खास जानकारी होती है. इस टेबल की हर लाइन में, एक कैलेंडर की जानकारी होती है. जैसे, नाम, रंग, सिंक करने की जानकारी वगैरह.
CalendarContract.Events इस टेबल में इवेंट की खास जानकारी होती है. इस टेबल की हर पंक्ति में किसी एक इवेंट की जानकारी होती है. जैसे, इवेंट का टाइटल, जगह, शुरू होने का समय, खत्म होने का समय वगैरह. इवेंट एक बार या कई बार हो सकता है. मीटिंग में हिस्सा लेने वाले लोगों, रिमाइंडर, और एक्सटेंड की गई प्रॉपर्टी को अलग-अलग टेबल में सेव किया जाता है. इनमें से हर एक में एक EVENT_ID होता है, जो इवेंट टेबल में मौजूद _ID का रेफ़रंस देता है.
CalendarContract.Instances इस टेबल में, किसी इवेंट के होने का शुरू और खत्म होने का समय होता है. इस टेबल की हर पंक्ति एक बार होने वाले इवेंट को दिखाती है. एक बार होने वाले इवेंट के लिए, इवेंट के इंस्टेंस की 1:1 मैपिंग होती है. बार-बार होने वाले इवेंट के लिए, ऐसी कई पंक्तियां अपने-आप जनरेट होती हैं जो उस इवेंट की एक से ज़्यादा घटनाओं से जुड़ी होती हैं.
CalendarContract.Attendees इस टेबल में, इवेंट में शामिल होने वाले व्यक्ति (मेहमान) की जानकारी होती है. हर पंक्ति किसी इवेंट के एक मेहमान को दिखाती है. इससे, इवेंट के लिए मेहमान के टाइप और मेहमान के जवाब की जानकारी मिलती है.
CalendarContract.Reminders इस टेबल में, सूचना/सूचना का डेटा होता है. हर लाइन, किसी इवेंट के लिए एक सूचना दिखाती है. किसी इवेंट के लिए एक से ज़्यादा रिमाइंडर सेट किए जा सकते हैं. हर इवेंट के लिए रिमाइंडर की ज़्यादा से ज़्यादा संख्या, MAX_REMINDERS में बताई गई है. इसे, उस सिंक अडैप्टर सेट करता है जिसके पास दिए गए कैलेंडर का मालिकाना हक होता है. रिमाइंडर, इवेंट से पहले मिनटों में तय किए जाते हैं. साथ ही, इनमें यह तय करने का तरीका भी होता है कि उपयोगकर्ता को सूचना कैसे दी जाएगी.

Calendar Provider API को इस तरह से डिज़ाइन किया गया है कि यह ज़रूरत के हिसाब से और बेहतर तरीके से काम कर सकता है. साथ ही साथ ही, असली उपयोगकर्ता को बेहतर अनुभव देना ज़रूरी है. साथ ही, कैलेंडर और उसके डेटा की सुरक्षा को बनाए रखना भी ज़रूरी है. आखिर में, एपीआई का इस्तेमाल करते समय इन बातों का ध्यान रखें:

  • कैलेंडर इवेंट डालना, अपडेट करना, और देखना. कैलेंडर की सेवा देने वाली कंपनी से सीधे इवेंट डालने, उनमें बदलाव करने, और उन्हें पढ़ने के लिए, आपके पास ज़रूरी अनुमतियां होनी चाहिए. हालांकि, अगर आपने कोई ऐसा कैलेंडर ऐप्लिकेशन या सिंक अडैप्टर नहीं बनाया है जिसमें सभी सुविधाएं मौजूद हैं, तो इन अनुमतियों का अनुरोध करना ज़रूरी नहीं है. इसके बजाय, Android के Calendar ऐप्लिकेशन के साथ काम करने वाले इंटेंट का इस्तेमाल करके, उस ऐप्लिकेशन को डेटा पढ़ने और उसमें डेटा सेव करने की अनुमति दी जा सकती है. इंटेंट का इस्तेमाल करने पर, आपका ऐप्लिकेशन उपयोगकर्ताओं को Calendar ऐप्लिकेशन पर भेजता है, ताकि वे पहले से भरे हुए फ़ॉर्म में मनचाहे काम कर सकें. इसके बाद, उन्हें आपके आवेदन पर वापस भेज दिया जाएगा. Calendar की मदद से सामान्य काम करने के लिए, अपने ऐप्लिकेशन को डिज़ाइन करके, उपयोगकर्ताओं को एक जैसा और बेहतर यूज़र इंटरफ़ेस दिया जा सकता है. हमारा सुझाव है कि आप ज़्यादा जानकारी के लिए, Calendar के लिए इंटेंट देखें.
  • अडैप्टर सिंक करें. सिंक अडैप्टर, उपयोगकर्ता के डिवाइस पर मौजूद कैलेंडर डेटा को किसी दूसरे सर्वर या डेटा सोर्स के साथ सिंक करता है. CalendarContract.Calendars और CalendarContract.Events टेबल में, ऐसे कॉलम होते हैं जिन्हें सिंक अडैप्टर इस्तेमाल करते हैं. सेवा देने वाली कंपनी और ऐप्लिकेशन को इनमें बदलाव नहीं करना चाहिए. असल में, वे तब तक नहीं दिखते, जब तक कि उन्हें सिंक अडैप्टर के तौर पर ऐक्सेस न किया जाए. सिंक करने वाले अडैप्टर के बारे में ज़्यादा जानकारी के लिए, सिंक करने वाले अडैप्टर देखें.

उपयोगकर्ता की अनुमतियां

कैलेंडर डेटा पढ़ने के लिए, किसी ऐप्लिकेशन को अपनी मेनिफ़ेस्ट फ़ाइल में READ_CALENDAR अनुमति को शामिल करना होगा. इसमें, कैलेंडर डेटा को मिटाने, डालने या अपडेट करने की WRITE_CALENDAR अनुमति ज़रूर होनी चाहिए:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"...>
    <uses-sdk android:minSdkVersion="14" />
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />
    ...
</manifest>

कैलेंडर टेबल

CalendarContract.Calendars टेबल में, अलग-अलग कैलेंडर की जानकारी होती है. Calendars के इन कॉलम में, ऐप्लिकेशन और सिंक अडैप्टर, दोनों लिख सकते हैं. इस्तेमाल किए जा सकने वाले फ़ील्ड की पूरी सूची के लिए, CalendarContract.Calendars रेफ़रंस देखें.

लगातार ब्यौरा
NAME कैलेंडर का नाम.
CALENDAR_DISPLAY_NAME इस कैलेंडर का वह नाम जो उपयोगकर्ता को दिखता है.
VISIBLE बूलियन वैल्यू, जो यह बताती है कि कैलेंडर को दिखाने के लिए चुना गया है या नहीं. 0 की वैल्यू से पता चलता है कि इस कैलेंडर से जुड़े इवेंट नहीं दिखाए जाने चाहिए. वैल्यू 1 से पता चलता है कि इस कैलेंडर से जुड़े इवेंट दिखाए जाने चाहिए. इस वैल्यू से, CalendarContract.Instances टेबल में लाइनों के जनरेशन पर असर पड़ता है.
SYNC_EVENTS एक बूलियन बताता है कि कैलेंडर को सिंक किया जाना चाहिए या नहीं और डिवाइस पर उसके इवेंट सेव होने चाहिए या नहीं. 0 वैल्यू का मतलब है कि इस कैलेंडर को सिंक न करें या इसके इवेंट को डिवाइस पर सेव न करें. वैल्यू 1 का मतलब है कि इस कैलेंडर के इवेंट सिंक करें और इवेंट को डिवाइस पर सेव करें.

सभी ऑपरेशन के लिए खाता टाइप शामिल करना

अगर किसी Calendars.ACCOUNT_NAME के बारे में क्वेरी की जाती है, तो आपको चुने गए विकल्पों में Calendars.ACCOUNT_TYPE को भी शामिल करना होगा. ऐसा इसलिए है, क्योंकि किसी खाते को सिर्फ़ तब यूनीक माना जाता है, जब उसके ACCOUNT_NAME और ACCOUNT_TYPE, दोनों एक जैसे न हों. ACCOUNT_TYPE, खाते के पुष्टि करने वाले उस ऐप्लिकेशन से जुड़ी स्ट्रिंग है जिसका इस्तेमाल, खाते को AccountManager के साथ रजिस्टर करते समय किया गया था. डिवाइस खाते से नहीं जुड़े कैलेंडर के लिए, एक खास तरह का खाता भी होता है. इसे ACCOUNT_TYPE_LOCAL कहा जाता है. ACCOUNT_TYPE_LOCAL खाते सिंक नहीं होते.

किसी कैलेंडर से जुड़ी क्वेरी करना

यहां एक उदाहरण में बताया गया है कि किसी खास उपयोगकर्ता के मालिकाना हक वाले कैलेंडर कैसे ऐक्सेस किए जा सकते हैं. इसे आसानी से समझने के लिए, इस उदाहरण में क्वेरी ऑपरेशन को यूज़र इंटरफ़ेस थ्रेड ("मुख्य थ्रेड") में दिखाया गया है. आम तौर पर, यह काम मुख्य थ्रेड के बजाय, असाइनोक्रोनस थ्रेड में किया जाना चाहिए. ज़्यादा जानकारी के लिए, लोडर देखें. अगर आप डेटा को सिर्फ़ पढ़ नहीं रहे हैं, बल्कि उसमें बदलाव भी कर रहे हैं, तो AsyncQueryHandler देखें.

Kotlin

// Projection array. Creating indices for this array instead of doing
// dynamic lookups improves performance.
private val EVENT_PROJECTION: Array<String> = arrayOf(
        CalendarContract.Calendars._ID,                     // 0
        CalendarContract.Calendars.ACCOUNT_NAME,            // 1
        CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,   // 2
        CalendarContract.Calendars.OWNER_ACCOUNT            // 3
)

// The indices for the projection array above.
private const val PROJECTION_ID_INDEX: Int = 0
private const val PROJECTION_ACCOUNT_NAME_INDEX: Int = 1
private const val PROJECTION_DISPLAY_NAME_INDEX: Int = 2
private const val PROJECTION_OWNER_ACCOUNT_INDEX: Int = 3

Java

// Projection array. Creating indices for this array instead of doing
// dynamic lookups improves performance.
public static final String[] EVENT_PROJECTION = new String[] {
    Calendars._ID,                           // 0
    Calendars.ACCOUNT_NAME,                  // 1
    Calendars.CALENDAR_DISPLAY_NAME,         // 2
    Calendars.OWNER_ACCOUNT                  // 3
};

// The indices for the projection array above.
private static final int PROJECTION_ID_INDEX = 0;
private static final int PROJECTION_ACCOUNT_NAME_INDEX = 1;
private static final int PROJECTION_DISPLAY_NAME_INDEX = 2;
private static final int PROJECTION_OWNER_ACCOUNT_INDEX = 3;

उदाहरण के अगले हिस्से में, अपनी क्वेरी बनाई जाती है. चुने गए विकल्प से, क्वेरी के लिए ज़रूरी शर्तों के बारे में पता चलता है. इस उदाहरण में, क्वेरी उन कैलेंडर को खोज रही है जिनमें ACCOUNT_NAME "hera@example.com", ACCOUNT_TYPE "com.example", और OWNER_ACCOUNT "hera@example.com" शामिल हैं. अगर आपको सिर्फ़ वे कैलेंडर नहीं देखने हैं जिनका मालिकाना हक उपयोगकर्ता के पास है, बल्कि वे सभी कैलेंडर देखने हैं जिन्हें उपयोगकर्ता ने देखा है, तो OWNER_ACCOUNT को हटाएं. क्वेरी से एक Cursor ऑब्जेक्ट मिलता है. इसका इस्तेमाल, डेटाबेस क्वेरी से मिले नतीजे के सेट को ट्रैवर्स करने के लिए किया जा सकता है. कॉन्टेंट देने वालों में क्वेरी का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, कॉन्टेंट देने वाले सेक्शन पर जाएं.

Kotlin

// Run query
val uri: Uri = CalendarContract.Calendars.CONTENT_URI
val selection: String = "((${CalendarContract.Calendars.ACCOUNT_NAME} = ?) AND (" +
        "${CalendarContract.Calendars.ACCOUNT_TYPE} = ?) AND (" +
        "${CalendarContract.Calendars.OWNER_ACCOUNT} = ?))"
val selectionArgs: Array<String> = arrayOf("hera@example.com", "com.example", "hera@example.com")
val cur: Cursor = contentResolver.query(uri, EVENT_PROJECTION, selection, selectionArgs, null)

Java

// Run query
Cursor cur = null;
ContentResolver cr = getContentResolver();
Uri uri = Calendars.CONTENT_URI;
String selection = "((" + Calendars.ACCOUNT_NAME + " = ?) AND ("
                        + Calendars.ACCOUNT_TYPE + " = ?) AND ("
                        + Calendars.OWNER_ACCOUNT + " = ?))";
String[] selectionArgs = new String[] {"hera@example.com", "com.example",
        "hera@example.com"};
// Submit the query and get a Cursor object back.
cur = cr.query(uri, EVENT_PROJECTION, selection, selectionArgs, null);

अगला सेक्शन, नतीजे के सेट पर जाने के लिए कर्सर का इस्तेमाल करता है. यह हर फ़ील्ड के लिए वैल्यू दिखाने के लिए, उदाहरण की शुरुआत में सेट अप की गई कॉन्स्टेंट का इस्तेमाल करता है.

Kotlin

// Use the cursor to step through the returned records
while (cur.moveToNext()) {
    // Get the field values
    val calID: Long = cur.getLong(PROJECTION_ID_INDEX)
    val displayName: String = cur.getString(PROJECTION_DISPLAY_NAME_INDEX)
    val accountName: String = cur.getString(PROJECTION_ACCOUNT_NAME_INDEX)
    val ownerName: String = cur.getString(PROJECTION_OWNER_ACCOUNT_INDEX)
    // Do something with the values...
}

Java

// Use the cursor to step through the returned records
while (cur.moveToNext()) {
    long calID = 0;
    String displayName = null;
    String accountName = null;
    String ownerName = null;

    // Get the field values
    calID = cur.getLong(PROJECTION_ID_INDEX);
    displayName = cur.getString(PROJECTION_DISPLAY_NAME_INDEX);
    accountName = cur.getString(PROJECTION_ACCOUNT_NAME_INDEX);
    ownerName = cur.getString(PROJECTION_OWNER_ACCOUNT_INDEX);

    // Do something with the values...

   ...
}

कैलेंडर में बदलाव करना

किसी कैलेंडर को अपडेट करने के लिए, कैलेंडर का _ID, यूआरआई (withAppendedId()) में जोड़ा गया आईडी या चुने गए पहले आइटम के तौर पर दिया जा सकता है. चुने गए "_id=?" से शुरू होना चाहिए और पहला selectionArg, कैलेंडर का _ID होना चाहिए. यूआरआई में आईडी को एन्कोड करके भी अपडेट किए जा सकते हैं. यह उदाहरण (withAppendedId()) अप्रोच का इस्तेमाल करके किसी कैलेंडर का डिसप्ले नेम बदलता है:

Kotlin

const val DEBUG_TAG: String = "MyActivity"
...
val calID: Long = 2
val values = ContentValues().apply {
    // The new display name for the calendar
    put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, "Trevor's Calendar")
}
val updateUri: Uri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calID)
val rows: Int = contentResolver.update(updateUri, values, null, null)
Log.i(DEBUG_TAG, "Rows updated: $rows")

Java

private static final String DEBUG_TAG = "MyActivity";
...
long calID = 2;
ContentValues values = new ContentValues();
// The new display name for the calendar
values.put(Calendars.CALENDAR_DISPLAY_NAME, "Trevor's Calendar");
Uri updateUri = ContentUris.withAppendedId(Calendars.CONTENT_URI, calID);
int rows = getContentResolver().update(updateUri, values, null, null);
Log.i(DEBUG_TAG, "Rows updated: " + rows);

कैलेंडर डालना

कैलेंडर को मुख्य रूप से सिंक एडैप्टर से मैनेज करने के लिए डिज़ाइन किया गया है. इसलिए, आपको सिर्फ़ सिंक एडैप्टर के तौर पर नए कैलेंडर जोड़ने चाहिए. ज़्यादातर मामलों में, ऐप्लिकेशन सिर्फ़ कैलेंडर में मामूली बदलाव कर सकते हैं. जैसे, डिसप्ले नेम बदलना. अगर किसी ऐप्लिकेशन के लिए स्थानीय कैलेंडर बनाना ज़रूरी है, तो ACCOUNT_TYPE_LOCAL के ACCOUNT_TYPE का इस्तेमाल करके, सिंक अडैप्टर के रूप में कैलेंडर शामिल करने की सुविधा इस्तेमाल करके ऐसा किया जा सकता है. ACCOUNT_TYPE_LOCAL ऐसे कैलेंडर के लिए एक खास खाता टाइप है जो किसी डिवाइस खाते से नहीं जुड़े हैं. इस तरह के कैलेंडर किसी सर्वर से सिंक नहीं किए जाते हैं. सिंक अडैप्टर के बारे में जानने के लिए, सिंक अडैप्टर लेख पढ़ें.

इवेंट टेबल

CalendarContract.Events टेबल में अलग-अलग इवेंट की जानकारी होती है. इवेंट जोड़ने, अपडेट करने या मिटाने के लिए, किसी ऐप्लिकेशन को अपनी मेनिफ़ेस्ट फ़ाइल में WRITE_CALENDAR अनुमति शामिल करनी होगी.

नीचे दिए गए इवेंट कॉलम में, ऐप्लिकेशन और सिंक एडेप्टर, दोनों लिख सकते हैं. इस्तेमाल किए जा सकने वाले फ़ील्ड की पूरी सूची के लिए, CalendarContract.Events रेफ़रंस देखें.

कॉन्स्टेंट ब्यौरा
CALENDAR_ID उस कैलेंडर का _ID जिससे इवेंट जुड़ा है.
ORGANIZER इवेंट के आयोजक (मालिक) का ईमेल पता.
TITLE इवेंट का टाइटल.
EVENT_LOCATION जहां इवेंट होगा.
DESCRIPTION इवेंट के बारे में जानकारी.
DTSTART इवेंट शुरू होने का समय, यूटीसी के हिसाब से मिलीसेकंड में.
DTEND Epoch के बाद से, UTC मिलीसेकंड में इवेंट के खत्म होने का समय.
EVENT_TIMEZONE इवेंट का टाइम ज़ोन.
EVENT_END_TIMEZONE इवेंट के खत्म होने का टाइम ज़ोन.
DURATION RFC5545 फ़ॉर्मैट में, इवेंट की अवधि. उदाहरण के लिए, "PT1H" की वैल्यू से पता चलता है कि इवेंट एक घंटे तक चलेगा. वहीं, "P2W" की वैल्यू से पता चलता है कि इवेंट दो हफ़्ते तक चलेगा.
ALL_DAY अगर वैल्यू 1 है, तो इसका मतलब है कि यह इवेंट पूरे दिन चलता है. यह समय, स्थानीय टाइम ज़ोन के हिसाब से तय किया जाता है. 0 वैल्यू का मतलब है कि यह एक सामान्य इवेंट है, जो दिन के किसी भी समय शुरू और खत्म हो सकता है.
RRULE इवेंट फ़ॉर्मैट के लिए, बार-बार होने की सुविधा का नियम. उदाहरण के लिए, "FREQ=WEEKLY;COUNT=10;WKST=SU". ज़्यादा उदाहरण यहां देखें.
RDATE इवेंट के दोहराए जाने की तारीखें. आम तौर पर, बार-बार होने वाली घटनाओं के एग्रीगेट सेट को तय करने के लिए, RDATE के साथ RRULE का इस्तेमाल किया जाता है. ज़्यादा जानकारी के लिए, RFC5545 की खास बातें देखें.
AVAILABILITY अगर इस इवेंट को व्यस्त समय या खाली समय के रूप में गिना जाता है, तो इसे बाद में शेड्यूल किया जा सकता है.
GUESTS_CAN_MODIFY क्या मेहमान इवेंट में बदलाव कर सकते हैं.
GUESTS_CAN_INVITE_OTHERS मेहमान, अन्य मेहमानों को न्योता भेज सकते हैं या नहीं.
GUESTS_CAN_SEE_GUESTS क्या मेहमान मेहमानों की सूची देख सकते हैं.

इवेंट जोड़ना

जब आपका ऐप्लिकेशन कोई नया इवेंट डालता है, तो हमारा सुझाव है कि आप इवेंट डालने के लिए इंटेंट का इस्तेमाल करना में बताए गए तरीके के हिसाब से, INSERT इंटेंट का इस्तेमाल करें. हालांकि, ज़रूरत पड़ने पर इवेंट को सीधे तौर पर भी डाला जा सकता है. इस सेक्शन में बताया गया है कि इसे कैसे करना है.

नया इवेंट डालने के लिए, ये नियम अपनाएं:

  • आपको CALENDAR_ID और DTSTART को शामिल करना होगा.
  • आपको एक EVENT_TIMEZONE शामिल करना होगा. सिस्टम में इंस्टॉल किए गए टाइम ज़ोन आईडी की सूची पाने के लिए, getAvailableIDs() का इस्तेमाल करें. ध्यान दें कि अगर इवेंट डालने के लिए इंटेंट का इस्तेमाल करना में बताए गए INSERT इंटेंट की मदद से इवेंट डाला जा रहा है, तो यह नियम लागू नहीं होता. इस स्थिति में, डिफ़ॉल्ट टाइम ज़ोन दिया जाता है.
  • बार-बार होने वाले इवेंट के लिए, आपको DTEND शामिल करना होगा.
  • बार-बार होने वाले इवेंट के लिए, आपको RRULE या RDATE के साथ-साथ DURATION भी शामिल करना होगा. ध्यान दें कि अगर INSERT इंटेंट की मदद से इवेंट डाला जा रहा है, तो यह नियम लागू नहीं होता. INSERT इंटेंट के बारे में इवेंट डालने के लिए इंटेंट का इस्तेमाल करना में बताया गया है. इस स्थिति में, DTSTART और DTEND के साथ RRULE का इस्तेमाल किया जा सकता है. Calendar ऐप्लिकेशन इसे अपने-आप अवधि में बदल देता है.

यहां इवेंट डालने का उदाहरण दिया गया है. इसे आसान बनाने के लिए, यूज़र इंटरफ़ेस (यूआई) की थ्रेड में किया जा रहा है. आम तौर पर, किसी कार्रवाई को बैकग्राउंड थ्रेड में ले जाने के लिए, डाले गए डेटा और अपडेट को असाइनॉन्स थ्रेड में डाला जाना चाहिए. ज़्यादा जानकारी के लिए, AsyncQueryHandler पर जाएं.

Kotlin

val calID: Long = 3
val startMillis: Long = Calendar.getInstance().run {
    set(2012, 9, 14, 7, 30)
    timeInMillis
}
val endMillis: Long = Calendar.getInstance().run {
    set(2012, 9, 14, 8, 45)
    timeInMillis
}
...

val values = ContentValues().apply {
    put(CalendarContract.Events.DTSTART, startMillis)
    put(CalendarContract.Events.DTEND, endMillis)
    put(CalendarContract.Events.TITLE, "Jazzercise")
    put(CalendarContract.Events.DESCRIPTION, "Group workout")
    put(CalendarContract.Events.CALENDAR_ID, calID)
    put(CalendarContract.Events.EVENT_TIMEZONE, "America/Los_Angeles")
}
val uri: Uri = contentResolver.insert(CalendarContract.Events.CONTENT_URI, values)

// get the event ID that is the last element in the Uri
val eventID: Long = uri.lastPathSegment.toLong()
//
// ... do something with event ID
//
//

Java

long calID = 3;
long startMillis = 0;
long endMillis = 0;
Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 9, 14, 7, 30);
startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 9, 14, 8, 45);
endMillis = endTime.getTimeInMillis();
...

ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Events.DTSTART, startMillis);
values.put(Events.DTEND, endMillis);
values.put(Events.TITLE, "Jazzercise");
values.put(Events.DESCRIPTION, "Group workout");
values.put(Events.CALENDAR_ID, calID);
values.put(Events.EVENT_TIMEZONE, "America/Los_Angeles");
Uri uri = cr.insert(Events.CONTENT_URI, values);

// get the event ID that is the last element in the Uri
long eventID = Long.parseLong(uri.getLastPathSegment());
//
// ... do something with event ID
//
//

ध्यान दें: देखें कि इस उदाहरण में, इवेंट बनने के बाद इवेंट आईडी को कैसे कैप्चर किया जाता है. इवेंट आईडी पाने का यह सबसे आसान तरीका है. कैलेंडर से जुड़े अन्य काम करने के लिए, अक्सर इवेंट आईडी की ज़रूरत पड़ती है. उदाहरण के लिए, किसी इवेंट में हिस्सा लेने वाले लोगों या रिमाइंडर जोड़ने के लिए.

इवेंट अपडेट

जब आपका ऐप्लिकेशन, उपयोगकर्ता को किसी इवेंट में बदलाव करने की अनुमति देना चाहता है, तो हमारा सुझाव है कि आप EDIT इंटेंट का इस्तेमाल करें, जैसा कि इवेंट में बदलाव करने के इंटेंट का इस्तेमाल करना में बताया गया है. हालांकि, ज़रूरत पड़ने पर इवेंट में सीधे बदलाव किया जा सकता है. किसी इवेंट को अपडेट करने के लिए, इवेंट का _ID, यूआरआई (withAppendedId()) में जोड़ा गया आईडी या चुने गए पहले आइटम के तौर पर दिया जा सकता है. चुनी गई वैल्यू "_id=?" से शुरू होनी चाहिए और पहला selectionArg, इवेंट का _ID होना चाहिए. बिना आईडी वाले चुनिंदा आइटम का इस्तेमाल करके भी अपडेट किए जा सकते हैं. यहां किसी इवेंट को अपडेट करने का उदाहरण दिया गया है. यह withAppendedId() के तरीके का इस्तेमाल करके, इवेंट का टाइटल बदलता है:

Kotlin

val DEBUG_TAG = "MyActivity"
...
val eventID: Long = 188
...
val values = ContentValues().apply {
    // The new title for the event
    put(CalendarContract.Events.TITLE, "Kickboxing")
}
val updateUri: Uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID)
val rows: Int = contentResolver.update(updateUri, values, null, null)
Log.i(DEBUG_TAG, "Rows updated: $rows")

Java

private static final String DEBUG_TAG = "MyActivity";
...
long eventID = 188;
...
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
Uri updateUri = null;
// The new title for the event
values.put(Events.TITLE, "Kickboxing");
updateUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
int rows = cr.update(updateUri, values, null, null);
Log.i(DEBUG_TAG, "Rows updated: " + rows);

इवेंट मिटाएं

किसी इवेंट को मिटाने के लिए, यूआरआई में जोड़े गए आईडी के तौर पर उसके _ID का इस्तेमाल करें या स्टैंडर्ड सिलेक्शन का इस्तेमाल करें. जोड़ा गया आईडी इस्तेमाल करने पर, कोई भी विकल्प नहीं चुना जा सकता. मिटाने के दो वर्शन हैं: ऐप्लिकेशन के रूप में और सिंक अडैप्टर के रूप में. ऐप्लिकेशन मिटाने पर, हटाए गए कॉलम को 1 पर सेट कर दिया जाता है. यह फ़्लैग, सिंक अडैप्टर को यह बताता है कि लाइन को मिटा दिया गया है. साथ ही, सर्वर को मिटाने की प्रोसेस शुरू होने की जानकारी देने वाला यह फ़्लैग. सिंक अडैप्टर मिटाने से, इवेंट और उससे जुड़े सभी डेटा डेटाबेस से हट जाते हैं. यहां ऐप्लिकेशन के _ID की मदद से इवेंट मिटाने का उदाहरण दिया गया है:

Kotlin

val DEBUG_TAG = "MyActivity"
...
val eventID: Long = 201
...
val deleteUri: Uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID)
val rows: Int = contentResolver.delete(deleteUri, null, null)
Log.i(DEBUG_TAG, "Rows deleted: $rows")

Java

private static final String DEBUG_TAG = "MyActivity";
...
long eventID = 201;
...
ContentResolver cr = getContentResolver();
Uri deleteUri = null;
deleteUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
int rows = cr.delete(deleteUri, null, null);
Log.i(DEBUG_TAG, "Rows deleted: " + rows);

मेहमानों की टेबल

CalendarContract.Attendees टेबल की हर पंक्ति, किसी इवेंट में शामिल एक व्यक्ति या मेहमान के बारे में बताती है. query() को कॉल करने पर, दिए गए EVENT_ID वाले इवेंट में शामिल लोगों की सूची दिखती है. यह EVENT_ID किसी खास इवेंट के _ID से मेल खाना चाहिए.

यहां दी गई टेबल में, लिखे जा सकने वाले फ़ील्ड की सूची दी गई है. किसी नए मेहमान को शामिल करते समय, आपको ATTENDEE_NAME को छोड़कर बाकी सभी को शामिल करना होगा.

लगातार ब्यौरा
EVENT_ID इवेंट का आईडी.
ATTENDEE_NAME मेहमान का नाम.
ATTENDEE_EMAIL मेहमान का ईमेल पता.
ATTENDEE_RELATIONSHIP

इवेंट में मेहमान का संबंध. इनमें से एक:

ATTENDEE_TYPE

मीटिंग में शामिल होने वाले व्यक्ति का टाइप. इनमें से कोई एक:

ATTENDEE_STATUS

मीटिंग में शामिल व्यक्ति की हाज़िरी की स्थिति. इनमें से एक:

मेहमानों को जोड़ें

यहां एक उदाहरण दिया गया है, जिसमें किसी इवेंट में एक मेहमान को शामिल किया जाता है. ध्यान दें कि EVENT_ID का इस्तेमाल करना ज़रूरी है:

Kotlin

val eventID: Long = 202
...
val values = ContentValues().apply {
    put(CalendarContract.Attendees.ATTENDEE_NAME, "Trevor")
    put(CalendarContract.Attendees.ATTENDEE_EMAIL, "trevor@example.com")
    put(
        CalendarContract.Attendees.ATTENDEE_RELATIONSHIP,
        CalendarContract.Attendees.RELATIONSHIP_ATTENDEE
    )
    put(CalendarContract.Attendees.ATTENDEE_TYPE, CalendarContract.Attendees.TYPE_OPTIONAL)
    put(
        CalendarContract.Attendees.ATTENDEE_STATUS,
        CalendarContract.Attendees.ATTENDEE_STATUS_INVITED
    )
    put(CalendarContract.Attendees.EVENT_ID, eventID)
}
val uri: Uri = contentResolver.insert(CalendarContract.Attendees.CONTENT_URI, values)

Java

long eventID = 202;
...
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Attendees.ATTENDEE_NAME, "Trevor");
values.put(Attendees.ATTENDEE_EMAIL, "trevor@example.com");
values.put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE);
values.put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_OPTIONAL);
values.put(Attendees.ATTENDEE_STATUS, Attendees.ATTENDEE_STATUS_INVITED);
values.put(Attendees.EVENT_ID, eventID);
Uri uri = cr.insert(Attendees.CONTENT_URI, values);

रिमाइंडर की टेबल

CalendarContract.Reminders टेबल की हर पंक्ति, किसी इवेंट के लिए एक रिमाइंडर दिखाती है. query() को कॉल करने पर, दिए गए EVENT_ID के साथ इवेंट के लिए रिमाइंडर की सूची दिखती है.

नीचे दी गई टेबल में, रिमाइंडर के लिए लिखने लायक फ़ील्ड दिए गए हैं. नया रिमाइंडर डालते समय, इन सभी को शामिल करना ज़रूरी है. ध्यान दें कि सिंक अडैप्टर, CalendarContract.Calendars टेबल में इस्तेमाल किए जा सकने वाले रिमाइंडर के टाइप के बारे में बताता है. ज़्यादा जानकारी के लिए, ALLOWED_REMINDERS पर जाएं.

लगातार ब्यौरा
EVENT_ID इवेंट का आईडी.
MINUTES इवेंट शुरू होने से पहले रिमाइंडर भेजने के लिए मिनट.
METHOD

अलार्म का तरीका, जैसा कि सर्वर पर सेट किया गया है. इनमें से कोई एक:

रिमाइंडर्स जोड़ें

इस उदाहरण में, किसी इवेंट में रिमाइंडर जोड़ा गया है. रिमाइंडर, इवेंट शुरू होने से 15 मिनट पहले भेजा जाता है.

Kotlin

val eventID: Long = 221
...
val values = ContentValues().apply {
    put(CalendarContract.Reminders.MINUTES, 15)
    put(CalendarContract.Reminders.EVENT_ID, eventID)
    put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT)
}
val uri: Uri = contentResolver.insert(CalendarContract.Reminders.CONTENT_URI, values)

Java

long eventID = 221;
...
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Reminders.MINUTES, 15);
values.put(Reminders.EVENT_ID, eventID);
values.put(Reminders.METHOD, Reminders.METHOD_ALERT);
Uri uri = cr.insert(Reminders.CONTENT_URI, values);

इंस्टेंस टेबल

CalendarContract.Instances टेबल में, किसी इवेंट के शुरू और खत्म होने का समय होता है. इस टेबल की हर लाइन, किसी एक इवेंट की जानकारी देती है. इंस्टेंस टेबल में डेटा नहीं जोड़ा जा सकता. इसमें सिर्फ़ इवेंट के होने की जानकारी पाने के लिए क्वेरी की जा सकती है.

यहां दी गई टेबल में कुछ ऐसे फ़ील्ड दिए गए हैं जिनके लिए किसी इंस्टेंस के बारे में क्वेरी की जा सकती है. ध्यान दें कि टाइम ज़ोन की जानकारी KEY_TIMEZONE_TYPE और KEY_TIMEZONE_INSTANCES से मिलती है.

कॉन्स्टेंट ब्यौरा
BEGIN यूटीसी के मुताबिक, इंस्टेंस के शुरू होने का समय मिलीसेकंड में.
END यूटीसी मिलीसेकंड में, इंस्टेंस के खत्म होने का समय.
END_DAY Calendar के टाइमज़ोन के हिसाब से, जूलियन कैलेंडर में इंस्टेंस के खत्म होने का दिन.
END_MINUTE इवेंट के खत्म होने का मिनट, जो Calendar के टाइम ज़ोन में आधी रात से मापा गया है.
EVENT_ID इस इंस्टेंस के लिए इवेंट का _ID.
START_DAY Calendar के टाइम ज़ोन के हिसाब से, इंस्टेंस के शुरू होने का जूलियन दिन.
START_MINUTE Calendar के टाइम ज़ोन के हिसाब से, मध्यरात्रि से शुरू होने वाले इंस्टेंस का मिनट.

इंस्टेंस टेबल पर क्वेरी करना

इंस्टेंस टेबल से क्वेरी करने के लिए, आपको यूआरआई में क्वेरी की समयसीमा तय करनी होगी. इस उदाहरण में, CalendarContract.Instances को TITLE फ़ील्ड का ऐक्सेस मिलता है. ऐसा, CalendarContract.EventsColumns इंटरफ़ेस को लागू करने की वजह से होता है. दूसरे शब्दों में, TITLE को डेटाबेस व्यू के ज़रिए दिखाया जाता है, न कि रॉ CalendarContract.Instances टेबल से क्वेरी करके.

Kotlin

const val DEBUG_TAG: String = "MyActivity"
val INSTANCE_PROJECTION: Array<String> = arrayOf(
        CalendarContract.Instances.EVENT_ID, // 0
        CalendarContract.Instances.BEGIN, // 1
        CalendarContract.Instances.TITLE // 2
)

// The indices for the projection array above.
const val PROJECTION_ID_INDEX: Int = 0
const val PROJECTION_BEGIN_INDEX: Int = 1
const val PROJECTION_TITLE_INDEX: Int = 2

// Specify the date range you want to search for recurring
// event instances
val startMillis: Long = Calendar.getInstance().run {
    set(2011, 9, 23, 8, 0)
    timeInMillis
}
val endMillis: Long = Calendar.getInstance().run {
    set(2011, 10, 24, 8, 0)
    timeInMillis
}

// The ID of the recurring event whose instances you are searching
// for in the Instances table
val selection: String = "${CalendarContract.Instances.EVENT_ID} = ?"
val selectionArgs: Array<String> = arrayOf("207")

// Construct the query with the desired date range.
val builder: Uri.Builder = CalendarContract.Instances.CONTENT_URI.buildUpon()
ContentUris.appendId(builder, startMillis)
ContentUris.appendId(builder, endMillis)

// Submit the query
val cur: Cursor = contentResolver.query(
        builder.build(),
        INSTANCE_PROJECTION,
        selection,
        selectionArgs, null
)
while (cur.moveToNext()) {
    // Get the field values
    val eventID: Long = cur.getLong(PROJECTION_ID_INDEX)
    val beginVal: Long = cur.getLong(PROJECTION_BEGIN_INDEX)
    val title: String = cur.getString(PROJECTION_TITLE_INDEX)

    // Do something with the values.
    Log.i(DEBUG_TAG, "Event: $title")
    val calendar = Calendar.getInstance().apply {
        timeInMillis = beginVal
    }
    val formatter = SimpleDateFormat("MM/dd/yyyy")
    Log.i(DEBUG_TAG, "Date: ${formatter.format(calendar.time)}")
}

Java

private static final String DEBUG_TAG = "MyActivity";
public static final String[] INSTANCE_PROJECTION = new String[] {
    Instances.EVENT_ID,      // 0
    Instances.BEGIN,         // 1
    Instances.TITLE          // 2
  };

// The indices for the projection array above.
private static final int PROJECTION_ID_INDEX = 0;
private static final int PROJECTION_BEGIN_INDEX = 1;
private static final int PROJECTION_TITLE_INDEX = 2;
...

// Specify the date range you want to search for recurring
// event instances
Calendar beginTime = Calendar.getInstance();
beginTime.set(2011, 9, 23, 8, 0);
long startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2011, 10, 24, 8, 0);
long endMillis = endTime.getTimeInMillis();

Cursor cur = null;
ContentResolver cr = getContentResolver();

// The ID of the recurring event whose instances you are searching
// for in the Instances table
String selection = Instances.EVENT_ID + " = ?";
String[] selectionArgs = new String[] {"207"};

// Construct the query with the desired date range.
Uri.Builder builder = Instances.CONTENT_URI.buildUpon();
ContentUris.appendId(builder, startMillis);
ContentUris.appendId(builder, endMillis);

// Submit the query
cur =  cr.query(builder.build(),
    INSTANCE_PROJECTION,
    selection,
    selectionArgs,
    null);

while (cur.moveToNext()) {
    String title = null;
    long eventID = 0;
    long beginVal = 0;

    // Get the field values
    eventID = cur.getLong(PROJECTION_ID_INDEX);
    beginVal = cur.getLong(PROJECTION_BEGIN_INDEX);
    title = cur.getString(PROJECTION_TITLE_INDEX);

    // Do something with the values.
    Log.i(DEBUG_TAG, "Event:  " + title);
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(beginVal);
    DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
    Log.i(DEBUG_TAG, "Date: " + formatter.format(calendar.getTime()));
    }
 }

कैलेंडर के इंटेंट

आपके ऐप्लिकेशन को कैलेंडर डेटा पढ़ने और लिखने के लिए अनुमतियों की ज़रूरत नहीं है. इसके बजाय, यह Android के Calendar ऐप्लिकेशन पर काम करने वाले इंटेंट का इस्तेमाल करके, उस ऐप्लिकेशन में पढ़ने और लिखने की कार्रवाइयों को बंद कर सकता है. यहां दी गई टेबल में, Calendar की सेवा देने वाली कंपनी के साथ काम करने वाले इंटेंट की सूची दी गई है:

कार्रवाई यूआरआई ब्यौरा बोनस वीडियो

VIEW

content://com.android.calendar/time/<ms_since_epoch>

CalendarContract.CONTENT_URI का इस्तेमाल करके भी यूआरआई को रेफ़र किया जा सकता है. इस इंटेंट का इस्तेमाल करने का उदाहरण देखने के लिए, कैलेंडर डेटा देखने के लिए इंटेंट का इस्तेमाल करना लेख पढ़ें.
<ms_since_epoch> में बताए गए समय के लिए कैलेंडर खोलें. कोई नहीं.

VIEW

content://com.android.calendar/events/<event_id>

यूआरआई को Events.CONTENT_URI से भी देखा जा सकता है. इस इंटेंट का इस्तेमाल करने का उदाहरण देखने के लिए, कैलेंडर डेटा देखने के लिए इंटेंट का इस्तेमाल करना लेख पढ़ें.
<event_id> से चुना गया इवेंट देखें. CalendarContract.EXTRA_EVENT_BEGIN_TIME


CalendarContract.EXTRA_EVENT_END_TIME
EDIT

content://com.android.calendar/events/<event_id>

Events.CONTENT_URI का इस्तेमाल करके भी यूआरआई को रेफ़र किया जा सकता है. इस इंटेंट के इस्तेमाल के उदाहरण के लिए, इवेंट में बदलाव करने के इंटेंट का इस्तेमाल करना देखें.
<event_id> से दिखाए गए इवेंट में बदलाव करें. CalendarContract.EXTRA_EVENT_BEGIN_TIME


CalendarContract.EXTRA_EVENT_END_TIME
EDIT

INSERT

content://com.android.calendar/events

Events.CONTENT_URI का इस्तेमाल करके भी यूआरआई को रेफ़र किया जा सकता है. इस इंटेंट के इस्तेमाल के उदाहरण के लिए, इवेंट शामिल करने के इंटेंट का इस्तेमाल करना देखें.
इवेंट बनाएं. नीचे दी गई टेबल में बताए गए अतिरिक्त फ़ीचर.

नीचे दी गई टेबल में, Calendar की सेवा देने वाली कंपनी के साथ काम करने वाली अतिरिक्त सुविधाएं दी गई हैं:

इंटेंट एक्स्ट्रा ब्यौरा
Events.TITLE इवेंट का नाम.
CalendarContract.EXTRA_EVENT_BEGIN_TIME इवेंट शुरू होने का समय, माइलस्टोन से मिलीसेकंड में.
CalendarContract.EXTRA_EVENT_END_TIME इवेंट के खत्म होने का समय, माइलीसेकंड में.
CalendarContract.EXTRA_EVENT_ALL_DAY यह एक बूलियन है, जिससे पता चलता है कि इवेंट पूरे दिन चलता है. इसकी वैल्यू true या false हो सकती है.
Events.EVENT_LOCATION इवेंट की जगह.
Events.DESCRIPTION इवेंट की जानकारी.
Intent.EXTRA_EMAIL जिन लोगों को न्योता देना है उनके ईमेल पते, कॉमा लगाकर अलग करके डालें.
Events.RRULE इवेंट के लिए बार-बार होने का नियम.
Events.ACCESS_LEVEL इवेंट निजी है या सार्वजनिक.
Events.AVAILABILITY यह इवेंट, व्यस्त समय के तौर पर गिना जाता है या यह खाली समय है, जिसे शेड्यूल किया जा सकता है.

इन सेक्शन में, इन इंटेंट को इस्तेमाल करने का तरीका बताया गया है.

इवेंट डालने के लिए इंटेंट का इस्तेमाल करना

INSERT इंटेंट का इस्तेमाल करने से, आपका ऐप्लिकेशन, इवेंट इंसर्शन के टास्क को कैलेंडर में ही ट्रांसफ़र कर देता है. इस तरीके का इस्तेमाल करने पर, आपके ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में WRITE_CALENDAR से जुड़ी अनुमति शामिल करने की ज़रूरत भी नहीं होती.

जब उपयोगकर्ता इस तरीके का इस्तेमाल करने वाला कोई ऐप्लिकेशन चलाते हैं, तो यह ऐप्लिकेशन उन्हें इवेंट जोड़ने की प्रक्रिया पूरी करने के लिए Calendar पर भेजता है. INSERT इंटेंट, Calendar में मौजूद इवेंट की जानकारी के साथ फ़ॉर्म को पहले से भरने के लिए, अतिरिक्त फ़ील्ड का इस्तेमाल करता है. इसके बाद, उपयोगकर्ता इवेंट को रद्द कर सकते हैं, ज़रूरत के हिसाब से फ़ॉर्म में बदलाव कर सकते हैं या इवेंट को अपने कैलेंडर में सेव कर सकते हैं.

यहां एक कोड स्निपेट दिया गया है, जो 19 जनवरी, 2012 को सुबह 7:30 बजे से सुबह 8:30 बजे तक चलने वाले इवेंट को शेड्यूल करता है. इस कोड स्निपेट के बारे में इन बातों का ध्यान रखें:

  • यह Events.CONTENT_URI को यूआरआई के तौर पर बताता है.
  • यह CalendarContract.EXTRA_EVENT_BEGIN_TIME और CalendarContract.EXTRA_EVENT_END_TIME अतिरिक्त फ़ील्ड का इस्तेमाल करके, फ़ॉर्म में इवेंट के समय की जानकारी पहले से भर देता है. इन समय की वैल्यू, Epoch के यूटीसी मिलीसेकंड में होनी चाहिए.
  • यह Intent.EXTRA_EMAIL के अतिरिक्त फ़ील्ड का इस्तेमाल करके, उन लोगों की कॉमा-सेपरेटेड लिस्ट उपलब्ध कराता है जिन्हें न्योता भेजा गया हो. इस सूची को ईमेल पते में बताया जाता है.

Kotlin

val startMillis: Long = Calendar.getInstance().run {
    set(2012, 0, 19, 7, 30)
    timeInMillis
}
val endMillis: Long = Calendar.getInstance().run {
    set(2012, 0, 19, 8, 30)
    timeInMillis
}
val intent = Intent(Intent.ACTION_INSERT)
        .setData(CalendarContract.Events.CONTENT_URI)
        .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startMillis)
        .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endMillis)
        .putExtra(CalendarContract.Events.TITLE, "Yoga")
        .putExtra(CalendarContract.Events.DESCRIPTION, "Group class")
        .putExtra(CalendarContract.Events.EVENT_LOCATION, "The gym")
        .putExtra(CalendarContract.Events.AVAILABILITY, CalendarContract.Events.AVAILABILITY_BUSY)
        .putExtra(Intent.EXTRA_EMAIL, "rowan@example.com,trevor@example.com")
startActivity(intent)

Java

Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 0, 19, 7, 30);
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 0, 19, 8, 30);
Intent intent = new Intent(Intent.ACTION_INSERT)
        .setData(Events.CONTENT_URI)
        .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis())
        .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis())
        .putExtra(Events.TITLE, "Yoga")
        .putExtra(Events.DESCRIPTION, "Group class")
        .putExtra(Events.EVENT_LOCATION, "The gym")
        .putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY)
        .putExtra(Intent.EXTRA_EMAIL, "rowan@example.com,trevor@example.com");
startActivity(intent);

किसी इवेंट में बदलाव करने के लिए इंटेंट का इस्तेमाल करना

इवेंट अपडेट करना सेक्शन में बताए गए तरीके से, किसी इवेंट को सीधे तौर पर अपडेट किया जा सकता है. हालांकि, EDIT इंटेंट का इस्तेमाल करने से, किसी ऐसे ऐप्लिकेशन को इवेंट में बदलाव करने की अनुमति मिल जाती है जिसके पास यह अनुमति नहीं है. जब उपयोगकर्ता Calendar में अपने इवेंट में बदलाव कर लेते हैं, तो उन्हें मूल ऐप्लिकेशन पर वापस ले जाया जाता है.

यहां एक ऐसे इंटेंट का उदाहरण दिया गया है जो किसी खास इवेंट के लिए नया टाइटल सेट करता है और उपयोगकर्ताओं को Calendar में इवेंट में बदलाव करने की सुविधा देता है.

Kotlin

val eventID: Long = 208
val uri: Uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID)
val intent = Intent(Intent.ACTION_EDIT)
        .setData(uri)
        .putExtra(CalendarContract.Events.TITLE, "My New Title")
startActivity(intent)

Java

long eventID = 208;
Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
Intent intent = new Intent(Intent.ACTION_EDIT)
    .setData(uri)
    .putExtra(Events.TITLE, "My New Title");
startActivity(intent);

कैलेंडर का डेटा देखने के लिए इंटेंट का इस्तेमाल करना

Calendar की सेवा देने वाली कंपनी, VIEW इंटेंट का इस्तेमाल करने के दो अलग-अलग तरीके उपलब्ध कराती है:

  • कैलेंडर को किसी खास तारीख पर खोलने के लिए.
  • किसी इवेंट को देखने के लिए.

यहां एक उदाहरण दिया गया है, जिसमें कैलेंडर को किसी खास तारीख पर खोलने का तरीका बताया गया है:

Kotlin

val startMillis: Long
...
val builder: Uri.Builder = CalendarContract.CONTENT_URI.buildUpon()
        .appendPath("time")
ContentUris.appendId(builder, startMillis)
val intent = Intent(Intent.ACTION_VIEW)
        .setData(builder.build())
startActivity(intent)

Java

// A date-time specified in milliseconds since the epoch.
long startMillis;
...
Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon();
builder.appendPath("time");
ContentUris.appendId(builder, startMillis);
Intent intent = new Intent(Intent.ACTION_VIEW)
    .setData(builder.build());
startActivity(intent);

यहां एक उदाहरण दिया गया है, जिसमें किसी इवेंट को देखने के लिए खोलने का तरीका बताया गया है:

Kotlin

val eventID: Long = 208
...
val uri: Uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID)
val intent = Intent(Intent.ACTION_VIEW).setData(uri)
startActivity(intent)

Java

long eventID = 208;
...
Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
Intent intent = new Intent(Intent.ACTION_VIEW)
   .setData(uri);
startActivity(intent);

सिंक अडैप्टर

ऐप्लिकेशन और सिंक अडैप्टर को Calendar उपलब्ध कराने वाली सेवा को ऐक्सेस करने के तरीके में मामूली अंतर होते हैं:

  • सिंक अडैप्टर को यह बताना होगा कि वह सिंक अडैप्टर है. इसके लिए, CALLER_IS_SYNCADAPTER को true पर सेट करें.
  • सिंक करने वाले अडैप्टर को यूआरआई में क्वेरी पैरामीटर के तौर पर ACCOUNT_NAME और ACCOUNT_TYPE देना होगा.
  • सिंक एडेप्टर के पास, ऐप्लिकेशन या विजेट के मुकाबले ज़्यादा कॉलम में डेटा लिखने का ऐक्सेस होता है. उदाहरण के लिए, कोई ऐप्लिकेशन किसी कैलेंडर की कुछ विशेषताओं में ही बदलाव कर सकता है. जैसे, उसका नाम, डिसप्ले नेम, दिखने की सेटिंग, और यह कि कैलेंडर सिंक किया गया है या नहीं. इसकी तुलना में, सिंक एडेप्टर सिर्फ़ उन कॉलम को ही नहीं, बल्कि कई अन्य कॉलम को भी ऐक्सेस कर सकता है. जैसे, कैलेंडर का रंग, टाइम ज़ोन, ऐक्सेस लेवल, जगह वगैरह. हालांकि, सिंक अडैप्टर सिर्फ़ उस ACCOUNT_NAME और ACCOUNT_TYPE के लिए काम करता है जिसे आपने तय किया है.

यहां एक सहायक तरीका दिया गया है. इसका इस्तेमाल करके, सिंक अडैप्टर के साथ इस्तेमाल करने के लिए यूआरआई लौटाया जा सकता है:

Kotlin

fun asSyncAdapter(uri: Uri, account: String, accountType: String): Uri {
    return uri.buildUpon()
            .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
            .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, account)
            .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, accountType).build()
}

Java

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