Làm cách nào để thêm các sự kiện lịch trong Android?


159

Tôi mới bắt đầu tăng tốc trên Android và hôm nay trong một cuộc họp dự án có người nói rằng Android không có ứng dụng lịch gốc nên người dùng chỉ cần sử dụng bất kỳ ứng dụng lịch nào họ thích.

Điều này có đúng không và nếu có thì làm cách nào để lập trình thêm một sự kiện vào lịch của người dùng? Có một API chung mà tất cả họ chia sẻ?

Để biết giá trị của nó, có lẽ chúng tôi đang nhắm mục tiêu Android 2.x.


Bạn có thể nên chấp nhận câu trả lời của oriharel vì anh ta cung cấp mã để hoàn thành nhiệm vụ của bạn.
jww

1
@SumitSharma liên kết của bạn dường như không còn hoạt động - và có vẻ khá đáng ngờ với hộp thoại cài đặt tự động.
sửa

Câu trả lời:


17

Làm cách nào để lập trình thêm một sự kiện vào lịch của người dùng?

Lịch nào?

Có một API chung mà tất cả họ chia sẻ?

Không, không có nhiều hơn "API chung mà tất cả họ chia sẻ" cho các ứng dụng lịch của Windows. Có một số định dạng dữ liệu phổ biến (ví dụ: iCalWiki) và các giao thức Internet (ví dụ: CalDAV), nhưng không có API chung. Một số ứng dụng lịch thậm chí không cung cấp API.

Nếu có các ứng dụng lịch cụ thể mà bạn muốn tích hợp, hãy liên hệ với nhà phát triển của họ và xác định xem họ có cung cấp API không. Vì vậy, ví dụ, ứng dụng Lịch từ dự án nguồn mở Android mà Mayra trích dẫn, không cung cấp API tài liệu và hỗ trợ. Google thậm chí đã tuyên bố rõ ràng với các nhà phát triển không sử dụng các kỹ thuật được nêu trong hướng dẫn Mayra trích dẫn.

Một tùy chọn khác là để bạn thêm các sự kiện vào lịch Internet được đề cập. Ví dụ: cách tốt nhất để thêm các sự kiện vào ứng dụng Lịch từ dự án nguồn mở Android là thêm sự kiện vào Lịch Google của người dùng thông qua API GData thích hợp.


CẬP NHẬT

Android 4.0 (API cấp 14) đã thêm a CalendarContract ContentProvider.


6
Chúng tôi không muốn nhắm mục tiêu một lịch cụ thể - chúng tôi chỉ muốn có thể thêm các sự kiện vào bất kỳ lịch nào mà người dùng đang sử dụng, để thuận tiện cho người dùng. Ứng dụng của chúng tôi cung cấp giao diện cho một trang web tổ chức các cuộc họp và hội nghị chuyên nghiệp. Vì vậy, nếu ai đó đăng ký một cái, thật tuyệt khi đưa nó vào lịch của họ.
Peter Nelson

3
@Peter Nelson: "Chúng tôi không muốn nhắm mục tiêu một lịch cụ thể - chúng tôi chỉ muốn có thể thêm các sự kiện vào bất kỳ lịch nào mà người dùng đang sử dụng, chỉ để thuận tiện cho người dùng." - bạn không thể làm điều đó trên Android nhiều hơn bạn có thể làm điều đó trên Windows. Trên cả hai nền tảng bạn đều không biết "bất kỳ lịch nào mà người dùng đang sử dụng" và trên cả hai nền tảng đều không có API chung để làm việc với một ứng dụng lịch như vậy.
CommonsWare

22
Tôi không biết tại sao bạn cứ so sánh nó với Windows - Mọi người tôi biết đều sử dụng điện thoại của họ để sắp xếp lịch trình và cuộc hẹn của họ - Tôi không biết ai làm điều đó trên PC của họ - có thể đó là một điều thế hệ. Nhưng tôi hiểu rằng Android không thể làm điều đó. Cảm ơn.
Peter Nelson

5
@Peter Nelson: Tôi tiếp tục so sánh nó với Windows vì mọi người đưa ra các giả định tương tự. Rất nhiều nhà phát triển nghĩ rằng họ có thể "thêm các sự kiện vào bất kỳ lịch nào mà người dùng đang sử dụng" trên Windows, vì họ nghĩ rằng mọi người đều sử dụng Outlook và do đó chỉ có một "lịch bất kỳ".
CommonsWare

1
@Yar: "Lịch điện thoại Android chính, mà bất kỳ điện thoại Android nào cũng có." - ngoại trừ tất cả các thiết bị Android không có ứng dụng đó. Ví dụ: nhiều thiết bị HTC không có ứng dụng đó mà thay vào đó có ứng dụng lịch riêng, chẳng hạn như HTC DROID Incredible sáu inch ở bên trái của tôi. Các nhà sản xuất thiết bị được hoan nghênh thay thế ứng dụng lịch - hoặc gần như bất kỳ ứng dụng nào khác - bằng cách triển khai của riêng họ.
CommonsWare

290

Hãy thử điều này trong mã của bạn:

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
Tôi thích giải pháp này rất nhiều. Chủ yếu là vì nó thúc đẩy người dùng chọn lịch của riêng mình (nếu anh ta có nhiều hơn một).
Sebastian Roth

2
Làm thế nào để làm cho nó tương thích với Android 2.2?
Srikanth Pai

13
Bạn nên sử dụng .setData (CalendarContract.Events.CONTENT_URI) thay vì setType, vì với setType (chuỗi), nó sẽ bị sập trên một số thiết bị!
Informatic0re

4
Hướng dẫn đầy đủ tại đây: code.tutsplus.com/tutorials/ Từ Tốt hơn là sử dụng các hằng số để tránh lỗi chính tả;)
Adrien Cadet

7
Mã của bạn yêu cầu ứng dụng của bạn gửi dữ liệu đến một ứng dụng (lịch) khác, sau đó sử dụng dữ liệu đó để thêm sự kiện lịch mới. Ứng dụng của bạn không ghi và cũng không đọc dữ liệu lịch, vì vậy bạn không cần bất kỳ quyền nào trong bảng kê khai.
Hát

66

Sử dụng API này trong mã của bạn .. Nó sẽ giúp bạn chèn sự kiện, sự kiện với lời nhắc và sự kiện với cuộc họp có thể được bật ... Api này hoạt động cho nền tảng 2.1 trở lên Những người sử dụng ít hơn 2.1 thay vì nội dung: // com .android.calWiki / event sử dụng nội dung: // calendar / event

 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
Tôi đã thêm event.put("eventTimezone", "UTC/GMT +2:00")và loại bỏ event.put("visibility", 3)event.put("transparency", 0)nó hoạt động tốt
lệ

1
Có thể nhận được lỗi múi giờ. Tôi thêm cái này và các tác phẩm của nó eventValues.put ("eventTimezone", TimeZone.getDefault (). GetID ());
Cüneyt

2
Tôi đang android.database.sqlite.SQLiteExceptionxếp hàngUri reminderUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(reminderUriString), reminderValues);
Sibidharan

1
nhưng một khi tôi đặt value.put ("rrule", "FREQ = HÀNG NGÀY"); và đặt endDate, nó không hoạt động. sự kiện được thiết lập cho tất cả các ngày không đến ngày kết thúc. @AmitabhaBiswas
urvi joshi

1
value.put (CalendarContract.Reminder.CALENDAR_ID, 1); value.put (CalendarContract.Reminder.TITLE, "Routine Everyday1"); value.put (CalendarContract.Reminder.DTSTART, millisecondsTimesEveryday); value.put (CalendarContract.Reminder.HAS_ALARM, true); value.put ("rrule", "FREQ = HÀNG NGÀY"); // UNTIL = 1924885800000 value.put (CalendarContract.Reminder.DTEND, EndtimeInMilliseconds); @AmitabhaBiswas
urvi joshi

57

Tôi đã sử dụng mã dưới đây, nó giải quyết vấn đề của tôi để thêm sự kiện trong lịch thiết bị mặc định trong ICS và trên phiên bản ít hơn 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);
        }

Hy vọng nó sẽ giúp .....


về Build.VERSION.SDK_INT> 14, làm cách nào tôi có thể thêm lời nhắc mặc định trong 60 phút và làm cách nào tôi có thể nhận Id của lời nhắc? Cảm ơn
dùng1796624

Xin chào, tôi đã tự hỏi liệu có thể sửa đổi màn hình hiển thị các trường lịch có thể chỉnh sửa hay không (như thay đổi giao diện của một số chế độ xem)?
dùng1950599

@ user1950599 Chắc chắn là không. Ý định bắt đầu một Hoạt động từ một ứng dụng khác và tương tác duy nhất với nó là dữ liệu bạn gửi thông qua ý định.
Pijusn


8

Chỉ trong trường hợp nếu ai đó cần điều này cho Xamarin trong 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);

Chức năng trợ giúp:

    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

Lịch Google là ứng dụng lịch "bản địa". Theo tôi biết, tất cả các điện thoại đều có phiên bản được cài đặt và SDK mặc định cung cấp một phiên bản.

Bạn có thể xem hướng dẫn này để làm việc với nó.


7

Thử cái này ,

   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

nếu bạn có một chuỗi Ngày nhất định với ngày và giờ.

ví dụ String givenDateString = pojoModel.getDate()/* Format dd-MMM-yyyy hh:mm:ss */

sử dụng mã sau đây để thêm một sự kiện có ngày và thời gian vào lịch

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

bạn phải thêm cờ:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

hoặc bạn sẽ gây ra lỗi với:

startActivity() từ bên ngoài bối cảnh Hoạt động yêu cầu FLAG_ACTIVITY_NEW_TASK

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.