Android에서 캘린더 일정을 추가하는 방법은 무엇입니까?


159

나는 안드로이드에서 속도를 높이고 있으며 오늘 프로젝트 회의에서 누군가 안드로이드에 기본 캘린더 앱이 없으므로 사용자는 원하는 캘린더 앱만 사용한다고 말했다.

이것이 사실입니까? 그렇다면 프로그래밍 방식으로 이벤트를 사용자의 캘린더에 어떻게 추가합니까? 그들이 공유하는 공통 API가 있습니까?

가치있는 것은 아마도 안드로이드 2.x를 목표로하고있을 것입니다.


그는 당신의 임무를 수행하기위한 코드를 제공하므로 oriharel의 대답을 받아 들여야 할 것입니다.
jww

1
@SumitSharma 귀하의 링크가 더 이상 작동하지 않는 것 같습니다-자동 설치 대화 상자가 의심스러운 것 같습니다.
수정

답변:


17

프로그래밍 방식으로 이벤트를 사용자의 캘린더에 추가하려면 어떻게합니까?

어떤 달력?

그들이 공유하는 공통 API가 있습니까?

아니요, Windows 캘린더 앱용으로 "모두 공유하는 공통 API"가 있습니다. 일반적인 데이터 형식 (예 : iCalendar)과 인터넷 프로토콜 (예 : CalDAV)이 있지만 공통 API는 없습니다. 일부 캘린더 앱은 API도 제공하지 않습니다.

통합하려는 특정 캘린더 애플리케이션이있는 경우 개발자에게 문의하여 API를 제공하는지 확인하십시오. 예를 들어 Mayra가 인용 한 Android 오픈 소스 프로젝트의 캘린더 애플리케이션은 문서화되고 지원되는 API를 제공하지 않습니다. 구글은 개발자들에게이 기술을 사용하지 말라고 명시 적으로 말했다 Mayra cite 튜토리얼에 설명 된 언급했다.

다른 옵션은 해당 인터넷 일정에 이벤트를 추가하는 것입니다. 예를 들어 Android 오픈 소스 프로젝트에서 캘린더 애플리케이션에 이벤트를 추가하는 가장 좋은 방법은 적절한 GData API를 통해 사용자의 Google 캘린더에 이벤트를 추가하는 것입니다.


최신 정보

Android 4.0 (API 레벨 14)에을 추가했습니다 CalendarContract ContentProvider.


6
특정 캘린더를 타겟팅하고 싶지는 않습니다. 사용자의 편의를 위해 사용자가 사용중인 캘린더에 이벤트를 추가하기 만하면됩니다. 우리의 응용 프로그램은 전문 회의 및 회의를 구성하는 웹 사이트에 대한 인터페이스를 제공합니다. 따라서 누군가가 하나를 등록하면 캘린더에 표시하는 것이 좋습니다.
피터 넬슨

3
@Peter Nelson : "우리는 특정 캘린더를 타겟팅하고 싶지 않습니다. 사용자의 편의를 위해 사용자가 사용하는 캘린더에 이벤트를 추가하기 만하면됩니다." -Windows에서 할 수있는 것보다 더 이상 Android에서 할 수 없습니다. 어느 플랫폼에서도 "사용자가 사용하는 캘린더"를 알고 있으며 어느 플랫폼에도 캘린더 응용 프로그램을 사용하기위한 범용 API가 없습니다.
CommonsWare

22
나는 왜 당신이 그것을 Windows와 계속 비교하는지 모른다. 내가 아는 모든 사람들은 자신의 일정과 약속을 정리하기 위해 전화를 사용한다. 나는 PC에서 그렇게하는 사람을 모른다. 아마도 세대 일 것이다. 그러나 나는 안드로이드가 그렇게 할 수 없다는 것을 안다. 감사.
피터 넬슨

5
@Peter Nelson : 사람들이 같은 가정을하므로 Windows와 계속 비교합니다. 많은 개발자들이 Windows에서 "사용자가 사용하는 모든 캘린더에 이벤트를 추가 할 수 있습니다"라고 생각합니다. 모든 사용자가 Outlook을 사용한다고 생각하기 때문에 하나의 "어떤 캘린더"도 있습니다.
CommonsWare

1
@Yar : "모든 Android 전화에있는 기본 Android 전화 캘린더." -해당 앱이없는 모든 Android 기기를 제외하고. 예를 들어 많은 HTC 장치에는 해당 앱이 없지만 왼쪽에 6 인치 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
나는이 솔루션을 많이 좋아합니다. 주로 사용자가 자신의 캘린더 (하나 이상이있는 경우)를 선택하도록 강요하기 때문입니다.
Sebastian Roth

2
이것을 안드로이드 2.2와 호환되게 만드는 방법은 무엇입니까?
Srikanth Pai

13
setType (string)을 사용하면 일부 장치에서 충돌하므로 setType 대신 .setData (CalendarContract.Events.CONTENT_URI)를 사용해야합니다!
Informatic0re

4
전체 튜토리얼 : code.tutsplus.com/tutorials/… 오타를 피하기 위해 상수를 사용하는 것이 좋습니다;)
Adrien Cadet

7
코드는 앱에 다른 (캘린더) 앱으로 데이터를 전송 한 다음 해당 데이터를 사용하여 새 캘린더 이벤트를 추가하도록합니다. 앱은 캘린더 데이터를 쓰거나 읽지 않으므로 매니페스트에 대한 권한이 필요하지 않습니다.
노래

66

이 API를 코드에서 사용하십시오. 이벤트, 알림이 포함 된 이벤트 및 미팅이있는 이벤트를 삽입 할 수 있습니다.이 API는 플랫폼 2.1 이상에서 작동합니다. content : // com 대신 2.1 이하를 사용하는 사용자 .android.calendar / events는 content : // 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.put ( "rrule", "FREQ = DAILY"); 작동하지 않는 endDate를 설정하십시오. 종료 날짜까지 모든 날짜에 설정된 이벤트. @AmitabhaBiswas
urvi joshi

1
values.put (CalendarContract.Reminders.CALENDAR_ID, 1); values.put (CalendarContract.Reminders.TITLE, "Routine Everyday1"); values.put (CalendarContract.Reminders.DTSTART, millisecondsTimesEveryday); values.put (CalendarContract.Reminders.HAS_ALARM, true); 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 분 동안 기본 알림을 추가하고 알림 ID를 어떻게 얻을 수 있습니까? 감사합니다
user1796624

안녕하세요, 편집 가능한 캘린더 필드를 보여주는 화면을 수정할 수 있는지 궁금합니다 (일부보기의 모양 변경과 같은)?
Yulric Sequeira

@ user1950599 아닙니다. 인 텐트는 다른 애플리케이션에서 활동을 시작하며 유일한 인터랙션은 인 텐트를 통해 전송하는 데이터입니다.
Pijusn


8

누군가가 C #에서 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 캘린더는 "기본"캘린더 앱입니다. 내가 아는 한, 모든 전화에는 설치된 버전이 있으며 기본 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 및 time과 함께 지정된 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.