Wie füge ich Kalenderereignisse in Android hinzu?

159

Ich bin gerade mit Android auf dem Laufenden und heute hat in einem Projekttreffen jemand gesagt, dass Android keine native Kalender-App hat, sodass Benutzer einfach die Kalender-App verwenden, die sie mögen.

Ist das wahr und wenn ja, wie füge ich programmgesteuert ein Ereignis zum Kalender des Benutzers hinzu? Gibt es eine gemeinsame API, die alle gemeinsam nutzen?

Für das, was es wert ist, zielen wir wahrscheinlich auf Android 2.x ab.

Peter Nelson
quelle
Sie sollten wahrscheinlich die Antwort von oriharel akzeptieren, da er den Code zur Erfüllung Ihrer Aufgabe bereitstellt.
Jww
1
@SumitSharma Ihr Link scheint nicht mehr zu funktionieren - und scheint mit dem automatischen Installationsdialog ziemlich verdächtig zu sein.
Fix

Antworten:

17

Wie füge ich programmgesteuert ein Ereignis zum Kalender des Benutzers hinzu?

Welcher Kalender?

Gibt es eine gemeinsame API, die alle gemeinsam nutzen?

Nein, es gibt nicht mehr als eine "gemeinsame API, die alle gemeinsam nutzen" für Windows-Kalender-Apps. Es gibt einige gängige Datenformate (z. B. iCalendar) und Internetprotokolle (z. B. CalDAV), jedoch keine gemeinsame API. Einige Kalender-Apps bieten nicht einmal eine API.

Wenn Sie bestimmte Kalenderanwendungen integrieren möchten, wenden Sie sich an deren Entwickler und ermitteln Sie, ob sie eine API anbieten. So bietet beispielsweise die von Mayra zitierte Kalenderanwendung aus dem Android-Open-Source-Projekt keine dokumentierten und unterstützten APIs. Google hat Entwicklern sogar ausdrücklich empfohlen, die im von Mayra zitierten Tutorial beschriebenen Techniken nicht zu verwenden .

Sie können auch Ereignisse zum betreffenden Internetkalender hinzufügen. Der beste Weg, um der Kalenderanwendung Ereignisse aus dem Android Open Source-Projekt hinzuzufügen, besteht beispielsweise darin, das Ereignis über die entsprechenden GData-APIs zum Google Kalender des Benutzers hinzuzufügen.


AKTUALISIEREN

Android 4.0 (API Level 14) hinzugefügt a CalendarContract ContentProvider.

CommonsWare
quelle
6
Wir möchten nicht auf einen bestimmten Kalender abzielen - wir möchten nur Ereignisse zu jedem Kalender hinzufügen können, den der Benutzer verwendet, nur um dem Benutzer die Arbeit zu erleichtern. Unsere App bietet eine Schnittstelle zu einer Website, die professionelle Meetings und Konferenzen organisiert. Wenn sich also jemand für einen anmeldet, wäre es schön, ihn in seinen Kalender aufzunehmen.
Peter Nelson
3
@Peter Nelson: "Wir möchten nicht auf einen bestimmten Kalender abzielen - wir möchten nur Ereignisse zu jedem Kalender hinzufügen können, den der Benutzer verwendet, nur um dem Benutzer die Arbeit zu erleichtern." - Sie können das unter Android nicht mehr tun als unter Windows. Auf keiner Plattform wissen Sie, "welchen Kalender der Benutzer verwendet", und auf keiner Plattform gibt es eine universelle API für die Arbeit mit einer solchen Kalenderanwendung.
CommonsWare
22
Ich weiß nicht, warum Sie es immer wieder mit Windows vergleichen. Jeder, den ich kenne, verwendet sein Telefon, um seine Zeitpläne und Termine zu organisieren. Ich kenne niemanden, der das auf seinem PC tut. Vielleicht ist es eine Generationssache. Aber ich verstehe, dass Android das nicht kann. Vielen Dank.
Peter Nelson
5
@ Peter Nelson: Ich vergleiche es immer wieder mit Windows, weil die Leute die gleichen Annahmen treffen. Viele Entwickler glauben, dass sie unter Windows "Ereignisse zu jedem Kalender hinzufügen können, den der Benutzer verwendet", weil sie der Meinung sind, dass jeder Outlook verwendet, und daher gibt es nur einen "beliebigen Kalender".
CommonsWare
1
@Yar: "Der Hauptkalender für Android-Telefone, den jedes Android-Telefon hat." - Mit Ausnahme aller Android-Geräte, die diese App nicht haben. Zum Beispiel haben viele HTC-Geräte diese App nicht, sondern eine eigene Kalender-App, wie das HTC DROID Incredible, sechs Zoll links von mir. Gerätehersteller können die Kalender-App - oder fast jede andere App - gerne durch eine eigene Implementierung ersetzen.
CommonsWare
290

Versuchen Sie dies in Ihrem Code:

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);
Oriharel
quelle
6
Ich mag diese Lösung sehr. Hauptsächlich, weil der Benutzer dadurch gezwungen wird, seinen eigenen Kalender auszuwählen (wenn er mehr als einen hat).
Sebastian Roth
2
Wie mache ich das kompatibel für Android 2.2?
Srikanth Pai
13
Sie sollten .setData (CalendarContract.Events.CONTENT_URI) anstelle von setType verwenden, da es mit setType (string) auf einigen Geräten abstürzt!
Informatic0re
4
Vollständiges Tutorial hier: code.tutsplus.com/tutorials/… Es ist besser, Konstanten zu verwenden, um Tippfehler zu vermeiden;)
Adrien Cadet
7
Ihr Code weist Ihre App an, Daten an eine andere (Kalender-) App zu senden, die diese Daten dann verwendet, um ein neues Kalenderereignis hinzuzufügen. Ihre App schreibt oder liest keine Kalenderdaten, sodass Sie keine Berechtigungen im Manifest benötigen.
Gesungen
66

Verwenden Sie diese API in Ihrem Code. Sie hilft Ihnen beim Einfügen von Ereignissen, Ereignissen mit Erinnerungen und Ereignissen mit Besprechungen. Diese API funktioniert für Plattform 2.1 und höher. Diejenigen, die weniger als 2.1 anstelle von content: // com verwenden .android.calendar / events verwendet 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", "[email protected]");// 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;

}
Pradeep
quelle
4
Ich habe hinzugefügt event.put("eventTimezone", "UTC/GMT +2:00")und beseitigt event.put("visibility", 3)und event.put("transparency", 0)und es funktioniert gut
validcat
1
Möglicherweise erhalten Sie einen Zeitzonenfehler. Ich füge dies und seine Werke hinzu eventValues.put ("eventTimezone", TimeZone.getDefault (). GetID ());
Cüneyt
2
Ich stehe android.database.sqlite.SQLiteExceptionin der SchlangeUri reminderUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(reminderUriString), reminderValues);
Sibidharan
1
aber eine, wenn ich values.put setze ("rrule", "FREQ = DAILY"); und setze endDate, es funktioniert nicht. Ereignis für alle Tage bis zum Enddatum festgelegt. @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 ("Regel", "FREQ = DAILY"); // UNTIL = 1924885800000 values.put (CalendarContract.Reminders.DTEND, EndtimeInMilliseconds); @AmitabhaBiswas
Urvi Joshi
57

Ich habe den folgenden Code verwendet. Es löst mein Problem, ein Ereignis im Standard-Gerätekalender in ICS und auch in einer Version ohne ICS hinzuzufügen

    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, "[email protected],[email protected]");
         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);
        }

Hoffe es würde helfen .....

Milan Shukla
quelle
Wie kann ich über Build.VERSION.SDK_INT> 14 eine Standarderinnerung für 60 Minuten hinzufügen und wie kann ich die ID der Erinnerung abrufen? Danke
user1796624
Hallo, ich habe mich gefragt, ob es möglich ist, den Bildschirm zu ändern, auf dem die bearbeitbaren Kalenderfelder angezeigt werden (z. B. das Aussehen einiger Ansichten ändern).
user1950599
@ user1950599 Auf keinen Fall. Absicht startet eine Aktivität von einer anderen Anwendung und die einzige Interaktion mit ihr sind die Daten, die Sie über die Absicht senden.
Pijusn
8

Nur für den Fall, dass jemand dies für Xamarin in c # benötigt:

        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);

Hilfsfunktionen:

    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;
    }
Dotsa
quelle
7

Google Kalender ist die "native" Kalender-App. Soweit ich weiß, wird auf allen Telefonen eine Version installiert, und das Standard-SDK bietet eine Version.

Sie können dieses Tutorial lesen, um damit zu arbeiten.

Cheryl Simon
quelle
7

Versuche dies ,

   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);
Arun Antoney
quelle
4

wenn Sie eine bestimmte Datumszeichenfolge mit Datum und Uhrzeit haben.

für zB String givenDateString = pojoModel.getDate()/* Format dd-MMM-yyyy hh:mm:ss */

Verwenden Sie den folgenden Code, um dem Kalender ein Ereignis mit Datum und Uhrzeit hinzuzufügen

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);
Arun
quelle
3

Sie müssen Flag hinzufügen:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

oder Sie verursachen Fehler mit:

startActivity() von außerhalb eines Aktivitätskontexts erfordert die FLAG_ACTIVITY_NEW_TASK

John Vuong
quelle