it-swarm.com.de

Wie füge ich Kalenderereignisse in Android hinzu?

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

Trifft dies zu, und wenn ja, wie füge ich dem Kalender des Benutzers programmgesteuert ein Ereignis hinzu? Gibt es eine gemeinsame API, die alle gemeinsam nutzen?

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

151
Peter Nelson

wie füge ich dem Kalender des Benutzers programmgesteuert ein Ereignis hinzu?

Welcher Kalender?

Gibt es eine gemeinsame API, die alle gemeinsam nutzen?

Nein, es gibt nur eine gemeinsame API für Windows-Kalender-Apps. Es gibt einige gängige Datenformate (z. B. iCalendar) und Internetprotokolle (z. B. CalDAV), jedoch keine gängige API. Einige Kalender-Apps bieten nicht einmal eine API an.

Wenn Sie bestimmte Kalenderanwendungen integrieren möchten, wenden Sie sich an deren Entwickler, und stellen Sie fest, ob sie eine API anbieten. So bietet beispielsweise die Kalenderanwendung aus dem Open Source-Projekt Android), das Mayra zitiert, keine dokumentierten und unterstützten APIs. Google hat sogar den Entwicklern ausdrücklich geraten, diese Techniken nicht zu verwenden im Tutorial Mayra zitiert umrissen.

Sie können dem betreffenden Internetkalender auch Ereignisse hinzufügen. Beispielsweise können Sie der Kalenderanwendung Ereignisse aus dem Android Open Source-Projekt) am besten hinzufügen, indem Sie das Ereignis über die entsprechenden GData-APIs zum Google-Kalender des Benutzers hinzufügen.


[~ # ~] Update [~ # ~]

Android 4.0 (API Level 14) hat ein CalendarContractContentProvider hinzugefügt.

20
CommonsWare

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

Verwenden Sie diese API in Ihrem Code. Es wird Ihnen helfen, Ereignisse, Ereignisse mit Erinnerung und Ereignisse mit Besprechungen einzufügen. Diese API funktioniert für Plattform 2.1 und höher .Android.calendar/events verwendet den Inhalt: // 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;

}
64
Pradeep

ich habe den folgenden Code verwendet. Er behebt mein Problem, indem ich ein Ereignis in den Standardgerätekalender in ICS und auch in eine Version weniger als ICS einfügte

    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 .....

55
Milan Shukla

Ab Android Version 4.0 offizielle APIs und Absichten sind verfügbar zur Interaktion mit den verfügbaren Kalenderanbieter .

39
tobsen

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;
    }
7
dotsa

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

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

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

7
Cheryl Simon

wenn Sie eine bestimmte Datumszeichenfolge mit Datum und Uhrzeit haben.

zum Beispiel 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);
4
Arun

sie müssen die Flagge hinzufügen:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

oder sie verursachen fehler mit:

startActivity() von außerhalb eines Aktivitätskontexts benötigt den FLAG_ACTIVITY_NEW_TASK

2
john vuong