Android में कैलेंडर ईवेंट कैसे जोड़ें?


159

मैं अभी एंड्रॉइड पर गति प्राप्त करने के लिए उठ रहा हूं, और आज एक प्रोजेक्ट मीटिंग में किसी ने कहा कि एंड्रॉइड का कोई मूल कैलेंडर ऐप नहीं है, इसलिए उपयोगकर्ता बस जो भी कैलेंडर ऐप पसंद करते हैं उसका उपयोग करते हैं।

क्या यह सच है, और यदि ऐसा है तो मैं प्रोग्राम को उपयोगकर्ता के कैलेंडर में कैसे जोड़ूं? क्या कोई सामान्य API है जो वे सभी साझा करते हैं?

इसके लायक क्या है, हम शायद Android 2.x को लक्षित कर रहे हैं।


आपको शायद oriharel के उत्तर को स्वीकार करना चाहिए क्योंकि वह आपके कार्य को पूरा करने के लिए कोड प्रदान करता है।
jww

1
@SumitSharma आपका लिंक अब काम नहीं कर रहा है - और स्वत: स्थापित संवाद के साथ बहुत संदिग्ध लगता है।
ठीक करें

जवाबों:


17

मैं उपयोगकर्ता के कैलेंडर में किसी कार्यक्रम को कैसे जोड़ूं?

कौन सा कैलेंडर?

क्या कोई सामान्य API है जो वे सभी साझा करते हैं?

नहीं, विंडोज कैलेंडर ऐप्स के लिए "सामान्य एपीआई वे सभी साझा करें" से अधिक नहीं है। कुछ सामान्य डेटा प्रारूप (जैसे, iCalendar) और इंटरनेट प्रोटोकॉल (जैसे, CalDAV) हैं, लेकिन कोई सामान्य API नहीं है। कुछ कैलेंडर ऐप्स API की पेशकश भी नहीं करते हैं।

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

एक अन्य विकल्प यह है कि आप प्रश्न में इंटरनेट कैलेंडर की घटनाओं को जोड़ सकते हैं। उदाहरण के लिए, एंड्रॉइड ओपन सोर्स प्रोजेक्ट से कैलेंडर एप्लिकेशन में घटनाओं को जोड़ने का सबसे अच्छा तरीका उपयोगकर्ता के Google कैलेंडर में इवेंट को उपयुक्त GData API के माध्यम से जोड़ना है।


अपडेट करें

Android 4.0 (एपीआई स्तर 14) में एक जोड़ा गया CalendarContract ContentProvider


6
हम एक विशिष्ट कैलेंडर को लक्षित नहीं करना चाहते हैं - हम केवल उपयोगकर्ता के लिए एक सुविधा के रूप में, उपयोगकर्ता द्वारा उपयोग किए जा रहे कैलेंडर में घटनाओं को जोड़ने में सक्षम होना चाहते हैं। हमारा ऐप एक वेबसाइट को एक इंटरफ़ेस प्रदान करता है जो पेशेवर बैठकों और सम्मेलनों का आयोजन करता है। इसलिए अगर कोई एक के लिए साइन अप करता है तो उसे अपने कैलेंडर में पॉप करना अच्छा होगा।
पीटर नेल्सन

3
@Peter नेल्सन: "हम किसी विशिष्ट कैलेंडर को लक्षित नहीं करना चाहते हैं - हम केवल उपयोगकर्ता के लिए एक सुविधा के रूप में, उपयोगकर्ता द्वारा उपयोग किए जा रहे कैलेंडर में घटनाओं को जोड़ने में सक्षम होना चाहते हैं।" - आप एंड्रॉइड पर ऐसा नहीं कर सकते हैं जितना आप विंडोज पर कर सकते हैं। न तो प्लेटफ़ॉर्म पर आप जानते हैं कि "उपयोगकर्ता जो भी कैलेंडर का उपयोग कर रहा है", और न ही प्लेटफ़ॉर्म पर ऐसे कैलेंडर एप्लिकेशन के साथ काम करने के लिए एक सार्वभौमिक एपीआई है।
कॉमन्सवेयर

22
मुझे नहीं पता कि आप इसे विंडोज से तुलना क्यों करते हैं - मुझे पता है कि हर कोई अपने शेड्यूल और अपॉइंटमेंट को व्यवस्थित करने के लिए अपने फोन का उपयोग करता है - मैं किसी को भी नहीं जानता जो अपने पीसी पर ऐसा करता है - शायद यह एक पीढ़ीगत बात है। लेकिन मुझे लगता है कि Android ऐसा नहीं कर सकता। धन्यवाद।
पीटर नेल्सन

5
@Peter नेल्सन: मैं इसे विंडोज से तुलना करना जारी रखता हूं क्योंकि लोग एक ही धारणा बनाते हैं। बहुत सारे डेवलपर्स को लगता है कि वे विंडोज पर "उपयोगकर्ता जो भी कैलेंडर का उपयोग कर रहे हैं" घटनाओं को जोड़ सकते हैं, क्योंकि उन्हें लगता है कि हर कोई आउटलुक का उपयोग करता है, और इसलिए केवल "जो भी कैलेंडर है"।
कॉमन्सवेयर

1
@ यार: "मुख्य एंड्रॉइड फोन कैलेंडर, जो किसी भी एंड्रॉइड फोन में है।" - उन सभी एंड्रॉइड डिवाइसों को छोड़कर जिनके पास वह ऐप नहीं है। उदाहरण के लिए, कई HTC उपकरणों में वह ऐप नहीं है, बल्कि उनका अपना कैलेंडर ऐप है, जैसे कि HTC DROID अविश्वसनीय छह इंच मेरे बाईं ओर। डिवाइस निर्माताओं को कैलेंडर एप्लिकेशन को बदलने का स्वागत किया जाता है - या केवल किसी अन्य ऐप के बारे में - अपने स्वयं के कार्यान्वयन के साथ।
कॉमन्सवेयर

290

इसे अपने कोड में आज़माएं:

Calendar cal = Calendar.getInstance();              
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setType("vnd.android.cursor.item/event");
intent.putExtra("beginTime", cal.getTimeInMillis());
intent.putExtra("allDay", true);
intent.putExtra("rrule", "FREQ=YEARLY");
intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000);
intent.putExtra("title", "A Test Event from android app");
startActivity(intent);

6
मुझे यह समाधान बहुत पसंद है। मुख्य रूप से क्योंकि यह उपयोगकर्ता को अपने स्वयं के कैलेंडर का चयन करने के लिए धक्का देता है (यदि उसके पास एक से अधिक है)।
सेबस्टियन रोथ

2
एंड्रॉइड 2.2 के लिए इसे कैसे अनुकूल बनाया जाए?
श्रीकांत पई

13
आपको setType के बजाय .setData (CalendarContract.Events.CONTENT_URI) का उपयोग करना चाहिए, क्योंकि setType (स्ट्रिंग) के साथ यह कुछ उपकरणों पर क्रैश हो जाएगा!
Informatic0re

4
पूर्ण ट्यूटोरियल यहां: code.tutsplus.com/tutorials/… टाइप्स से बचने के लिए स्थिरांक का उपयोग करना बेहतर है;)
एड्रियन कैडेट

7
आपका कोड आपके ऐप को दूसरे (कैलेंडर) ऐप पर डेटा भेजने के लिए कहता है जो फिर नए कैलेंडर ईवेंट को जोड़ने के लिए उस डेटा का उपयोग करता है। आपका ऐप कैलेंडर डेटा नहीं लिखता और न ही पढ़ता है, इसलिए आपको मेनिफ़ेस्ट में किसी भी अनुमति की आवश्यकता नहीं है।
singed

66

अपने कोड में इस एपीआई का उपयोग करें .. यह आपको ईवेंट डालने में मदद करेगा, रिमाइंडर के साथ ईवेंट और मीटिंग के साथ ईवेंट को सक्षम किया जा सकता है ... यह एपीआई प्लेटफ़ॉर्म 2.1 और इसके बाद के संस्करण के लिए काम करता है जो सामग्री के बजाय 2.1 का उपयोग करते हैं: // com .android.calendar / ईवेंट सामग्री का उपयोग करते हैं: // कैलेंडर / ईवेंट

 public static long pushAppointmentsToCalender(Activity curActivity, String title, String addInfo, String place, int status, long startDate, boolean needReminder, boolean needMailService) {
    /***************** Event: note(without alert) *******************/

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

    eventValues.put("calendar_id", 1); // id, We need to choose from
                                        // our mobile for primary
                                        // its 1
    eventValues.put("title", title);
    eventValues.put("description", addInfo);
    eventValues.put("eventLocation", place);

    long endDate = startDate + 1000 * 60 * 60; // For next 1hr

    eventValues.put("dtstart", startDate);
    eventValues.put("dtend", endDate);

    // values.put("allDay", 1); //If it is bithday alarm or such
    // kind (which should remind me for whole day) 0 for false, 1
    // for true
    eventValues.put("eventStatus", status); // This information is
    // sufficient for most
    // entries tentative (0),
    // confirmed (1) or canceled
    // (2):
    eventValues.put("eventTimezone", "UTC/GMT +2:00");
   /*Comment below visibility and transparency  column to avoid java.lang.IllegalArgumentException column visibility is invalid error */

    /*eventValues.put("visibility", 3); // visibility to default (0),
                                        // confidential (1), private
                                        // (2), or public (3):
    eventValues.put("transparency", 0); // You can control whether
                                        // an event consumes time
                                        // opaque (0) or transparent
                                        // (1).
      */
    eventValues.put("hasAlarm", 1); // 0 for false, 1 for true

    Uri eventUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(eventUriString), eventValues);
    long eventID = Long.parseLong(eventUri.getLastPathSegment());

    if (needReminder) {
        /***************** Event: Reminder(with alert) Adding reminder to event *******************/

        String reminderUriString = "content://com.android.calendar/reminders";

        ContentValues reminderValues = new ContentValues();

        reminderValues.put("event_id", eventID);
        reminderValues.put("minutes", 5); // Default value of the
                                            // system. Minutes is a
                                            // integer
        reminderValues.put("method", 1); // Alert Methods: Default(0),
                                            // Alert(1), Email(2),
                                            // SMS(3)

        Uri reminderUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(reminderUriString), reminderValues);
    }

    /***************** Event: Meeting(without alert) Adding Attendies to the meeting *******************/

    if (needMailService) {
        String attendeuesesUriString = "content://com.android.calendar/attendees";

        /********
         * To add multiple attendees need to insert ContentValues multiple
         * times
         ***********/
        ContentValues attendeesValues = new ContentValues();

        attendeesValues.put("event_id", eventID);
        attendeesValues.put("attendeeName", "xxxxx"); // Attendees name
        attendeesValues.put("attendeeEmail", "yyyy@gmail.com");// Attendee
                                                                            // E
                                                                            // mail
                                                                            // id
        attendeesValues.put("attendeeRelationship", 0); // Relationship_Attendee(1),
                                                        // Relationship_None(0),
                                                        // Organizer(2),
                                                        // Performer(3),
                                                        // Speaker(4)
        attendeesValues.put("attendeeType", 0); // None(0), Optional(1),
                                                // Required(2), Resource(3)
        attendeesValues.put("attendeeStatus", 0); // NOne(0), Accepted(1),
                                                    // Decline(2),
                                                    // Invited(3),
                                                    // Tentative(4)

        Uri attendeuesesUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(attendeuesesUriString), attendeesValues);
    }

    return eventID;

}

4
मैंने जोड़ा event.put("eventTimezone", "UTC/GMT +2:00")और सफाया कर दिया event.put("visibility", 3)और event.put("transparency", 0)यह अच्छी तरह से काम करता है
मान्य

1
शायद टाइमजोन एरर मिले। मैं इसे और इसके कार्यों को जोड़ता हूं EventValues.put ("eventTimezone", TimeZone.getDefault ()। GetID ());
कॉन्येट

2
मैं android.database.sqlite.SQLiteExceptionलाइन में हो रहा हूंUri reminderUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(reminderUriString), reminderValues);
सिबिधरन

1
लेकिन एक जब मैं मान सेट करता हूं ।put ("रूल", "FREQ = DAILY"); और अंत काम सेट, अपने काम नहीं कर रहा है। अंतिम तिथि तक सभी दिनों के लिए निर्धारित कार्यक्रम। @AmitabhaBiswas
joshi

1
मान .put (CalendarContract.Reminders.CALENDAR_ID, 1); मान .put (CalendarContract.Reminders.TITLE, "रूटीन एवरीडे 1"); मान .put (CalendarContract.Reminders.DTSTART, मिलीसेकंडइमेंडे); मान .put (CalendarContract.Reminders.HAS_ALARM, सच); मान.पुट ("क्रूस", "फ्रेक = डेली"); // UNTIL = 1924885800000 मान ।put (CalendarContract.Reminders.DTEND, EndtimeInMilliseconds); @AmitabhaBiswas
joshi

57

मैंने नीचे दिए गए कोड का उपयोग किया है, यह ICS में डिफ़ॉल्ट डिवाइस कैलेंडर में ईवेंट को जोड़ने की मेरी समस्या को हल करता है और वह भी कम संस्करण पर ICS

    if (Build.VERSION.SDK_INT >= 14) {
        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);
}

    else {
        Calendar cal = Calendar.getInstance();              
        Intent intent = new Intent(Intent.ACTION_EDIT);
        intent.setType("vnd.android.cursor.item/event");
        intent.putExtra("beginTime", cal.getTimeInMillis());
        intent.putExtra("allDay", true);
        intent.putExtra("rrule", "FREQ=YEARLY");
        intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000);
        intent.putExtra("title", "A Test Event from android app");
        startActivity(intent);
        }

आशा है कि यह मदद करेगा .....


Build.VERSION.SDK_INT> 14 के बारे में, मैं 60 मिनट के लिए डिफ़ॉल्ट अनुस्मारक कैसे जोड़ सकता हूं और मुझे अनुस्मारक की आईडी कैसे मिल सकती है? धन्यवाद
user1796624

नमस्ते, मैं सोच रहा था कि क्या यह संभव हो सकता है स्क्रीन को संशोधित करने के लिए जो संपादन योग्य कैलेंडर फ़ील्ड दिखाता है (जैसे परिवर्तन कैसे देखें कुछ दृश्य)?
यूल्रिक सेकेरा

@ user1950599 निश्चित रूप से नहीं। आशय एक अन्य अनुप्रयोग से एक गतिविधि शुरू करता है और इसके साथ केवल अंतःक्रिया जो डेटा आप इरादे से भेजते हैं।
पीजूस

40

एंड्रॉइड वर्जन के रूप में 4.0 आधिकारिक एपीआई और इंटेंस उपलब्ध कैलेंडर प्रदाताओं के साथ बातचीत करने के लिए उपलब्ध हैं ।


4
वास्तव में उपयोगी टिप्पणी, यह एक पर्याप्त तनाव नहीं कर सकता :)
Warpzit

1
शायद आप लिंक-केवल उत्तर के साथ जाने के लिए कुछ कोड प्रदान कर सकते हैं?
jww

8

बस अगर किसी को X # में Xamarin के लिए इसकी जरूरत है:

        Intent intent = new Intent(Intent.ActionInsert);
        intent.SetData(Android.Provider.CalendarContract.Events.ContentUri);
        intent.PutExtra(Android.Provider.CalendarContract.ExtraEventBeginTime, Utils.Tools.CurrentTimeMillis(game.Date));
        intent.PutExtra(Android.Provider.CalendarContract.EventsColumns.AllDay, false);
        intent.PutExtra(Android.Provider.CalendarContract.EventsColumns.EventLocation, "Location");
        intent.PutExtra(Android.Provider.CalendarContract.EventsColumns.Description, "Description");
        intent.PutExtra(Android.Provider.CalendarContract.ExtraEventEndTime, Utils.Tools.CurrentTimeMillis(game.Date.AddHours(2)));
        intent.PutExtra(Android.Provider.CalendarContract.EventsColumns.Title, "Title");
        StartActivity(intent);

सहायक कार्य:

    private static readonly DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

    public static long CurrentTimeMillis(DateTime date)
    {
        return (long)(date.ToUniversalTime() - Jan1st1970).TotalMilliseconds;
    }

7

Google कैलेंडर "मूल" कैलेंडर ऐप है। जहां तक ​​मुझे पता है, सभी फोन इंस्टॉल किए गए संस्करण के साथ आते हैं, और डिफ़ॉल्ट एसडीके एक संस्करण प्रदान करता है।

आप इसके साथ काम करने के लिए इस ट्यूटोरियल को देख सकते हैं।


7

इसे इस्तेमाल करे ,

   Calendar beginTime = Calendar.getInstance();
    beginTime.set(yearInt, monthInt - 1, dayInt, 7, 30);



    ContentValues l_event = new ContentValues();
    l_event.put("calendar_id", CalIds[0]);
    l_event.put("title", "event");
    l_event.put("description",  "This is test event");
    l_event.put("eventLocation", "School");
    l_event.put("dtstart", beginTime.getTimeInMillis());
    l_event.put("dtend", beginTime.getTimeInMillis());
    l_event.put("allDay", 0);
    l_event.put("rrule", "FREQ=YEARLY");
    // status: 0~ tentative; 1~ confirmed; 2~ canceled
    // l_event.put("eventStatus", 1);

    l_event.put("eventTimezone", "India");
    Uri l_eventUri;
    if (Build.VERSION.SDK_INT >= 8) {
        l_eventUri = Uri.parse("content://com.android.calendar/events");
    } else {
        l_eventUri = Uri.parse("content://calendar/events");
    }
    Uri l_uri = MainActivity.this.getContentResolver()
            .insert(l_eventUri, l_event);

4

यदि आपके पास दिनांक और समय के साथ एक तारीख स्ट्रिंग है।

उदाहरण के लिए String givenDateString = pojoModel.getDate()/* Format dd-MMM-yyyy hh:mm:ss */

कैलेंडर में दिनांक और समय के साथ कोई घटना जोड़ने के लिए निम्न कोड का उपयोग करें

Calendar cal = Calendar.getInstance();
cal.setTime(new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss").parse(givenDateString));
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setType("vnd.android.cursor.item/event");
intent.putExtra("beginTime", cal.getTimeInMillis());
intent.putExtra("allDay", false);
intent.putExtra("rrule", "FREQ=YEARLY");
intent.putExtra("endTime",cal.getTimeInMillis() + 60 * 60 * 1000);
intent.putExtra("title", " Test Title");
startActivity(intent);

3

आपको ध्वज जोड़ना होगा:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

या आप के साथ त्रुटि का कारण होगा:

startActivity() एक गतिविधि संदर्भ के बाहर से की आवश्यकता है FLAG_ACTIVITY_NEW_TASK

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.