วิธีเพิ่มกิจกรรมในปฏิทินใน Android


159

ฉันเพิ่งจะเร่งความเร็วให้กับ Android และในวันนี้ในการประชุมโครงการใครบางคนกล่าวว่า Android ไม่มีแอปปฏิทินพื้นเมืองดังนั้นผู้ใช้เพียงแค่ใช้แอพปฏิทินที่พวกเขาชอบ

สิ่งนี้เป็นจริงหรือไม่และถ้าฉันจะเพิ่มเหตุการณ์ในปฏิทินของผู้ใช้โดยทางโปรแกรมได้อย่างไร มี API ทั่วไปที่พวกเขาแบ่งปันทั้งหมดหรือไม่

สำหรับสิ่งที่คุ้มค่าเราอาจตั้งเป้าหมาย Android 2.x


คุณควรยอมรับคำตอบของ oriharel เพราะเขาให้รหัสเพื่อให้งานของคุณสำเร็จ
jww

1
@SumitSharma ดูเหมือนว่าลิงก์ของคุณจะใช้งานไม่ได้อีกต่อไป - และดูเหมือนว่าจะน่าสงสัยมากกับกล่องโต้ตอบการติดตั้งอัตโนมัติ
แก้ไข

คำตอบ:


17

ฉันจะเพิ่มเหตุการณ์ลงในปฏิทินของผู้ใช้โดยทางโปรแกรมได้อย่างไร

ปฏิทินไหน

มี API ทั่วไปที่พวกเขาแบ่งปันทั้งหมดหรือไม่

ไม่ไม่มากไปกว่านั้นมี "API ทั่วไปที่ทุกคนใช้ร่วมกัน" สำหรับแอปปฏิทิน Windows มีรูปแบบข้อมูลทั่วไปบางอย่าง (เช่น iCalendar) และอินเทอร์เน็ตโปรโตคอล (เช่น CalDAV) แต่ไม่มี API ทั่วไป แอปปฏิทินบางรายการไม่มีแม้แต่ API

หากมีแอปพลิเคชั่นปฏิทินที่คุณต้องการรวมเข้าด้วยกันให้ติดต่อผู้พัฒนาและตรวจสอบว่าพวกเขามี API หรือไม่ ตัวอย่างเช่นแอปพลิเคชันปฏิทินจากโครงการโอเพ่นซอร์ส Android ที่ Mayra อ้างอิงไม่มีบริการ API ที่ได้รับการบันทึกและรองรับ Google ได้บอกผู้พัฒนาอย่างชัดเจนว่าไม่ใช้เทคนิคที่ระบุไว้ในบทช่วยสอนของ Mayra

ตัวเลือกอื่นสำหรับคุณที่จะเพิ่มกิจกรรมในปฏิทินอินเทอร์เน็ตที่เป็นปัญหา ตัวอย่างเช่นวิธีที่ดีที่สุดในการเพิ่มกิจกรรมในแอปพลิเคชันปฏิทินจากโครงการโอเพ่นซอร์ส Android คือการเพิ่มกิจกรรมไปยัง Google Calendar ของผู้ใช้ผ่าน GData API ที่เหมาะสม


UPDATE

Android 4.0 (API ระดับ 14) CalendarContract ContentProviderเพิ่ม


6
เราไม่ต้องการกำหนดเป้าหมายปฏิทินที่เฉพาะเจาะจง - เราเพียงต้องการให้สามารถเพิ่มกิจกรรมลงในปฏิทินใด ๆ ที่ผู้ใช้กำลังใช้อยู่เพื่ออำนวยความสะดวกให้กับผู้ใช้ แอพของเรามีส่วนต่อประสานกับเว็บไซต์ที่จัดการประชุมและสัมมนาระดับมืออาชีพ ดังนั้นหากมีคนลงชื่อสมัครเข้าใช้มันจะเป็นการดีที่จะปรากฏในปฏิทินของพวกเขา
ปีเตอร์เนลสัน

3
@Peter Nelson: "เราไม่ต้องการกำหนดเป้าหมายปฏิทินที่เฉพาะเจาะจง - เราเพียงแค่ต้องการเพิ่มกิจกรรมลงในปฏิทินใด ๆ ที่ผู้ใช้กำลังใช้อยู่เพื่อความสะดวกของผู้ใช้" - คุณไม่สามารถทำสิ่งนี้บน Android ได้มากกว่าที่คุณสามารถทำได้บน Windows คุณไม่ทราบว่าบนแพลตฟอร์มใด ๆ "ไม่ว่าจะใช้ปฏิทินใดก็ตามที่ผู้ใช้ใช้" และบนแพลตฟอร์มทั้งสองไม่มี API สากลสำหรับการทำงานกับแอปพลิเคชันปฏิทินดังกล่าว
CommonsWare

22
ฉันไม่รู้ว่าทำไมคุณถึงเปรียบเทียบมันกับ Windows - ทุกคนที่ฉันรู้จักใช้โทรศัพท์ของพวกเขาในการจัดตารางเวลาและการนัดหมายของพวกเขา - ฉันไม่รู้ว่าใครทำเช่นนั้นบนพีซีของพวกเขา - อาจเป็นเรื่องทั่วไป แต่ฉันเข้าใจว่า Android ทำไม่ได้ ขอบคุณ
Peter Nelson

5
@ Peter เนลสัน: ฉันเปรียบเทียบมันกับ Windows เพราะคนทำสมมติฐานเดียวกัน นักพัฒนาหลายคนคิดว่าพวกเขาสามารถ "เพิ่มกิจกรรมลงในปฏิทินใดก็ได้ที่ผู้ใช้ใช้งาน" บน Windows เพราะพวกเขาคิดว่าทุกคนใช้ Outlook และด้วยเหตุนี้จึงมี "ปฏิทินอะไรก็ได้" เพียงรายการเดียว
CommonsWare

1
@Yar: "ปฏิทินในโทรศัพท์ Android หลักซึ่งมีโทรศัพท์ Android ใด ๆ " - ยกเว้นอุปกรณ์ Android ทั้งหมดที่ไม่มีแอพนั้น ตัวอย่างเช่นอุปกรณ์ HTC จำนวนมากไม่มีแอพนั้น แต่มีแอพปฏิทินของตัวเองเช่น HTC DROID Incredible หกนิ้วทางซ้าย ผู้ผลิตอุปกรณ์ยินดีที่จะเปลี่ยนแอพปฏิทิน - หรือแอพอื่น ๆ - ด้วยการใช้งานของพวกเขาเอง
CommonsWare

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
จะทำให้ใช้งานร่วมกับ android 2.2 ได้อย่างไร?
Srikanth Pai

13
คุณควรใช้. setData (CalendarContract.Events.CONTENT_URI) แทน setType เพราะด้วย setType (สตริง) มันจะผิดพลาดในอุปกรณ์บางอย่าง!
Informatic0re

4
แบบฝึกหัดเต็มรูปแบบที่นี่: code.tutsplus.com/tutorials/… จะดีกว่าถ้าใช้ค่าคงที่เพื่อหลีกเลี่ยงการพิมพ์ผิด)
Adrien Cadet

7
รหัสของคุณบอกให้แอปของคุณส่งข้อมูลไปยังแอปอื่น (ปฏิทิน) ซึ่งจะใช้ข้อมูลนั้นเพื่อเพิ่มกิจกรรมในปฏิทินใหม่ แอปของคุณไม่ได้เขียนหรืออ่านข้อมูลปฏิทินดังนั้นคุณไม่จำเป็นต้องขออนุญาตใด ๆ ในไฟล์ Manifest
ร้องเพลง

66

ใช้ API นี้ในรหัสของคุณมันจะช่วยให้คุณสามารถแทรกเหตุการณ์เหตุการณ์ที่มีการเตือนและเหตุการณ์ที่มีการประชุมสามารถเปิดใช้งาน ... api นี้ใช้งานได้กับแพลตฟอร์ม 2.1 และสูงกว่าผู้ที่ใช้น้อยกว่า 2.1 แทนเนื้อหา: // com .android.calendar / events ใช้เนื้อหา: // calendar / events

 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)มันทำงานได้ดี
validcat

1
อาจได้รับข้อผิดพลาดของเขตเวลา ฉันเพิ่มสิ่งนี้และผลงานของมัน eventValues.put ("eventTimezone", TimeZone.getDefault (). getID ());
Cüneyt

2
ฉันกำลังจะandroid.database.sqlite.SQLiteExceptionถึงสายUri reminderUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(reminderUriString), reminderValues);
Sibidharan

1
แต่หนึ่งเมื่อฉันตั้งค่า values ​​("rrule", "FREQ = DAILY"); และตั้งค่า endDate มันไม่ทำงาน เหตุการณ์ที่ตั้งไว้สำหรับทุกวันไม่ถึงวันที่สิ้นสุด @AmitabhaBiswas
urvi joshi

1
values.put (CalendarContract.Reminders.CALENDAR_ID, 1); values.put (CalendarContract.Reminders.TITLE, "งานประจำทุกวัน 1"); values.put (CalendarContract.Reminders.DTSTART, มิลลิวินาทีวินาที TimeEveryday); values.put (CalendarContract.Reminders.HAS_ALARM จริง); values.put ("rrule", "FREQ = DAILY"); // UNTIL = 1924885800000 values.put (CalendarContract.Reminders.DTEND, EndtimeInMilliseconds); @AmitabhaBiswas
urvi 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

สวัสดีฉันสงสัยว่าเป็นไปได้ไหมที่จะปรับเปลี่ยนหน้าจอที่แสดงเขตข้อมูลปฏิทินที่แก้ไขได้ (เช่นเปลี่ยนลักษณะการดูบางส่วน)
Yulric Sequeira

@ user1950599 ไม่อย่างแน่นอน เจตนาเริ่มต้นกิจกรรมจากแอปพลิเคชันอื่นและการโต้ตอบเท่านั้นคือข้อมูลที่คุณส่งผ่านเจตนา
Pijusn

40

ขณะที่รุ่น Android 4.0 APIs อย่างเป็นทางการและเจตนาที่มีอยู่ในการโต้ตอบกับที่มีผู้ให้บริการปฏิทิน


4
ความคิดเห็นที่เป็นประโยชน์จริง ๆ ไม่สามารถ
กดดัน

1
บางทีคุณสามารถให้รหัสเพื่อไปพร้อมกับคำตอบสำหรับลิงค์เท่านั้น?
jww

8

ในกรณีที่มีคนต้องการสิ่งนี้สำหรับ Xamarin ใน c #:

        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 เป็นแอปปฏิทิน "ดั้งเดิม" เท่าที่ฉันรู้โทรศัพท์ทั้งหมดมาพร้อมกับรุ่นที่ติดตั้งและ SDK เริ่มต้นให้รุ่น

คุณอาจลองดูบทช่วยสอนนี้เพื่อทำงานกับมัน


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

หากคุณมีสตริง Date ที่ระบุพร้อมวันที่และเวลา

สำหรับเช่น 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.