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.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 |
CalendarContract.CONTENT_URI का इस्तेमाल करके भी यूआरआई को रेफ़र किया जा सकता है.
इस इंटेंट का इस्तेमाल करने का उदाहरण देखने के लिए, कैलेंडर डेटा देखने के लिए इंटेंट का इस्तेमाल करना लेख पढ़ें.
|
<ms_since_epoch> में बताए गए समय के लिए कैलेंडर खोलें. |
कोई नहीं. |
Events.CONTENT_URI से भी देखा जा सकता है.
इस इंटेंट का इस्तेमाल करने का उदाहरण देखने के लिए, कैलेंडर डेटा देखने के लिए इंटेंट का इस्तेमाल करना लेख पढ़ें.
|
<event_id> से चुना गया इवेंट देखें. |
CalendarContract.EXTRA_EVENT_BEGIN_TIME CalendarContract.EXTRA_EVENT_END_TIME |
|
EDIT |
Events.CONTENT_URI का इस्तेमाल करके भी यूआरआई को रेफ़र किया जा सकता है.
इस इंटेंट के इस्तेमाल के उदाहरण के लिए, इवेंट में बदलाव करने के इंटेंट का इस्तेमाल करना देखें.
|
<event_id> से दिखाए गए इवेंट में बदलाव करें. |
CalendarContract.EXTRA_EVENT_BEGIN_TIME CalendarContract.EXTRA_EVENT_END_TIME |
EDIT INSERT |
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(); }