Android कैलेंडर API



यह लेख मानक एंड्रॉइड कैलेंडर के साथ काम करने के लिए अनिर्धारित एपीआई का उपयोग करने के बारे में बात करेगा। मुझे इस विषय पर रूसी में लेख नहीं मिले, और अंग्रेजी में पुराने डेटा के साथ कुछ ही पोस्ट हैं। कौन रुचि रखता है - बिल्ली के नीचे।



क्यों?



मुझे इस तरह की समस्या का सामना करना पड़ा जब मैं अपने विश्वविद्यालय के कार्यक्रम को संकलित करने के लिए एक आवेदन लिख रहा था। अपने कार्यक्रम को अलग से रखना सुविधाजनक है, और यहां तक ​​कि मानक कैलेंडर एक सप्ताह के बाद की घटनाओं को दोहराने का समर्थन नहीं करता है, जो दो सप्ताह (विषम / सम) के कार्यक्रम के लिए आवश्यक है।

फिक्स का विचार एक एप्लिकेशन फ़ंक्शन था जो आपको दर्ज किए गए शेड्यूल के साथ एंड्रॉइड कैलेंडर को "भरने" की अनुमति देता है। लाभ स्पष्ट हैं: Google से Google कैलेंडर के साथ सिंक्रनाइज़ेशन (टॉटोलॉजी के लिए क्षमा करें), अंतर्निहित कैलेंडर विजेट (यह विजेट एचटीसी सेंस से बहुत अच्छा है) और तीसरे पक्ष के निर्माताओं से विजेट का एक पहाड़ है जो कम से कम अगले सप्ताह, कम से कम एक व्यस्त सप्ताह, आदि को दिखाएगा। यहां और Android कैलेंडर के साथ काम करने की आवश्यकता है।



एक अनजाने एपीआई का उपयोग कर बुरा है! Pnyatnenko?





क्या इस स्पष्ट समस्या को हल करने के लिए एक अनिर्दिष्ट एपीआई का उपयोग करना वास्तव में आवश्यक है? जवाब है नहीं। सबसे सही तरीका Google कैलेंडर API का उपयोग करना है , जो मैं आपको अपने विकास में करने की सलाह देता हूं।



लेकिन "सही" विधि कई सीमाएं लगाती है:

• इसका उपयोग इंटरनेट कनेक्शन की अनुपस्थिति में नहीं किया जा सकता है;

• कैलेंडर को भरने के बाद सिंक्रनाइज़ेशन की आवश्यकता है;

• डेटा (और पूरे वर्ष भर भरने में थोड़ा नहीं) सर्वर पर जाता है और फिर सिंक्रनाइज़ेशन के दौरान वापस चला जाता है, जो स्पष्ट रूप से, यातायात को दोगुना कर देता है।



मेरी राय में, कैलेंडर के ऑफ़लाइन संस्करण का उपयोग करना अधिक सुविधाजनक है, जो किसी भी अवसर पर, Google कैलेंडर के साथ सिंक्रनाइज़ किया जा सकता है। दुर्भाग्य से Google ने एंड्रॉइड के लिए डेवलपर्स का ध्यान नहीं रखा और आधिकारिक एपीआई को प्रकाशित नहीं किया, लेकिन हमारे आनंद के लिए एंड्रॉइड स्रोत कोड खुले हैं और स्मार्ट लोग लंबे समय तक जादू यूआरआई सामग्री प्रदाता हैं।



हम उपयोगकर्ता से कैलेंडर के साथ काम करने की अनुमति मांगते हैं





विरोधाभास। कोई एपीआई नहीं है, लेकिन प्रलेखन में अनुमति है। आपको बस उन्हें अपने AndroidManifest.xml पर जोड़ना होगा।



<uses-permission android:name="android.permission.READ_CALENDAR"> </uses-permission> <uses-permission android:name="android.permission.WRITE_CALENDAR"> </uses-permission>
      
      





एकीकृत संसाधन पहचानकर्ता या रूसी में - URI



Android कैलेंडर का उपयोग करने के लिए, हमें एक विशिष्ट URI में इसके सामग्री प्रदाता से संपर्क करना चाहिए। हमारे चगरिन के लिए, यह यूआरआई ओएस के विभिन्न संस्करणों में भिन्न होता है और निम्नलिखित में बहुत अच्छी तरह से बदल सकता है (एक अनिर्दिष्ट एपीआई का उपयोग करने की लागत)। लेकिन समस्या हल करने योग्य है।

Froyo [2.2] के लिए और अगले संस्करणों के लिए एक उच्च संभावना के साथ - सामग्री: //com.android.calendar/calendars

संस्करणों के लिए <2.2 - सामग्री: // कैलेंडर / कैलेंडर

जैसा कि आप देख सकते हैं, सब कुछ इतना बुरा नहीं है। आप सिस्टम के संस्करण को निर्धारित कर सकते हैं और उपयुक्त यूआरआई का उपयोग कर सकते हैं, लेकिन मैं दूसरे रास्ते पर चला गया। मैं देखता हूं कि अगर <2.2 के लिए यूआरआई द्वारा कुछ भी है और अगर कोई नहीं है, तो मैं बाकी का उपयोग करता हूं।



 // Calendar URI before 2.2 Uri calendars = Uri.parse("content://calendar/calendars"); Cursor managedCursor = this.managedQuery(calendars, new String[] { "_id", "name" }, null, null, null); if(managedCursor == null || managedCursor.getCount() == 0) { // 2.2 (Froyo) } else { // < 2.2 }
      
      





हम मानते हैं कि यूआरआई प्राप्त हुआ।



कैलेंडर की एक सूची प्राप्त करें



Google कैलेंडर उपयोगकर्ताओं के लिए, आपको समझाने की आवश्यकता नहीं है, लेकिन बाकी के लिए मैं समझाता हूँ। एक साझा कैलेंडर में एक या अधिक छोटे कैलेंडर होते हैं, जो मार्करों के साथ रंग में भिन्न हो सकते हैं। आमतौर पर यह "व्यक्तिगत", "कार्य", "अध्ययन", आदि कुछ है। आप ऐसे कैलेंडर केवल Google कैलेंडर वेबसाइट पर बना सकते हैं, जिस Android में आप मानक उपकरण के साथ ऐसा नहीं कर सकते।

घटनाओं को जोड़ने के लिए, हमें कैलेंडर आईडी को जानना होगा। इस कार्य को पूरा करने के लिए, हम पिछले पैराग्राफ से निर्माण का उपयोग करते हैं।



 String[] projection = new String[] { "_id", "name" }; Cursor managedCursor = this.managedQuery(URI, projection, null, null, null); if (managedCursor != null && managedCursor.moveToFirst()) { String calName; String calID; int nameColumn = managedCursor.getColumnIndex("name"); int idColumn = managedCursor.getColumnIndex("_id"); do { calName = managedCursor.getString(nameColumn); calID = managedCursor.getString(idColumn); if (calName != null) // … UI } while (managedCursor.moveToNext()); managedCursor.close(); }
      
      





अब नामों का परिणामी सेट इंटरफ़ेस पर प्रदर्शित किया जा सकता है और उपयोगकर्ता को चुनने की अनुमति दे सकता है।



ईवेंट जोड़ें



यहां, किसी अन्य सामग्री प्रदाता के साथ, कैलेंडर के साथ काम होता है। यह प्रलेखन में पाया जा सकता है।



 ContentValues event = new ContentValues(); event.put("calendar_id", calID); // ID     event.put("title", title); //   event.put("description", desc); //   event.put("eventLocation", loc); //   event.put("dtstart", start); //   event.put("dtend", end); //   eventsURI=Uri.parse(URI + “/events"); this.getContentResolver().insert(eventsURI, event);
      
      





आइए घटना क्षेत्रों के बारे में बात करते हैं। मैं एक घटना को इंगित करने के लिए विवरण क्षेत्र का उपयोग करने की सलाह देता हूं। इस फ़ील्ड का उपयोग करना, फिर आपके प्रोग्राम द्वारा बनाई गई सभी घटनाओं को थोक में हटाना संभव होगा। नाम, विवरण और स्थल के क्षेत्र स्ट्रिंग हैं। अलग-अलग, यह समय क्षेत्रों का उल्लेख करने योग्य है। ये फ़ील्ड प्रकार के होते हैं, और इन फ़ील्ड्स के मान उत्पन्न हो सकते हैं, उदाहरण के लिए, निम्न फ़ंक्शन द्वारा।



 public static long pickDate(int year, int month, int day, int hour, int minute) { Calendar rightNow = Calendar.getInstance(); int timeShift = rightNow.get(Calendar.ZONE_OFFSET); return Date.UTC(year - 1900, month, day, hour - (timeShift / 3600000), minute, 0); }
      
      





मुझे लगता है कि आप इसे अपने लिए समझ लेंगे, मैं केवल यह ध्यान रखूंगा कि यह वर्तमान समय क्षेत्र को ध्यान में रखे।



ईवेंट हटाएँ



किसी संदेश को ID से हटाने के लिए, आपको उसे URI में जोड़ना होगा।



 //eventsURI = URI + events/ uri = ContentUris.withAppendedId(eventsURI, EVENT_ID); this.getContentResolver().delete(uri, null, null);
      
      





अन्य फ़ील्ड द्वारा हटाने के लिए, आप सभी घटनाओं को बाहर निकालने के लिए कर्सर का उपयोग कर सकते हैं, जैसा कि हमने कैलेंडर के साथ किया था, और फिर आईडी द्वारा चुनिंदा रूप से हटाएं।



निष्कर्ष



अंत में, मैं आपको एक बार फिर याद दिलाता हूं कि आप इसका उपयोग अपने जोखिम और जोखिम पर करते हैं। विकास के दौरान, मैंने URI को एक बार गलत लिखा था और हर बार सिंक्रोनाइज़ेशन के दौरान मेरा फोन एक त्रुटि देने लगा था (इसे कैलेंडर से जानकारी मिटाकर बिल्कुल ठीक कर दिया गया था)।

एक और उपद्रव - एमुलेटर में कोई कैलेंडर नहीं है, इसलिए, उपरोक्त सभी को दोहराना संभव नहीं होगा।

और निष्कर्ष में। मैं अपने आवेदन के प्रचार का अवसर नहीं ले सकता, जिसकी चर्चा लेख में की गई थी। आप इसे यूटीमेटेबल नामक बाजार में पा सकते हैं।









और निष्कर्ष में, मैं हेब्रस्ट्रुडेंट्स से पूछना चाहता हूं: आपके विश्वविद्यालय में एक प्रारूप क्या है (एक / दो सप्ताह) और इन हफ्तों को क्या कहा जाता है यदि वे दो हैं - सम / विषम या भिन्न? विदेशी विश्वविद्यालयों में भी रुचि।



All Articles