web-dev-qa-db-fra.com

Comment ajouter des événements de calendrier dans Android?

Je commence tout juste à me familiariser avec Android et aujourd'hui, lors d'une réunion de projet, quelqu'un a déclaré que Android ne dispose d'aucune application de calendrier native, de sorte que les utilisateurs n'utilisent que l'application de calendrier de leur choix.

Est-ce vrai et, le cas échéant, comment puis-je ajouter par programme un événement au calendrier de l'utilisateur? Existe-t-il une API commune qu'ils partagent tous?

Pour ce que cela vaut, nous ciblons probablement Android 2.x.

151
Peter Nelson

comment puis-je ajouter par programme un événement au calendrier de l'utilisateur?

Quel calendrier?

Existe-t-il une API commune qu'ils partagent tous?

Non, pas plus qu'il n'y a une "API commune qu'ils partagent tous" pour les applications de calendrier Windows. Il existe des formats de données courants (par exemple, iCalendar) et des protocoles Internet (par exemple, CalDAV), mais pas d'API commune. Certaines applications de calendrier n'offrent même pas d'API.

Si vous souhaitez intégrer des applications de calendrier spécifiques, contactez leurs développeurs et déterminez s'ils proposent une API. Ainsi, par exemple, l'application Calendrier du projet open source Android, citée par Mayra, n'offre aucune API documentée et prise en charge. Google a même dit explicitement aux développeurs de ne pas utiliser les techniques décrits dans le tutoriel cité par Mayra.

Une autre option consiste à ajouter des événements au calendrier Internet en question. Par exemple, le meilleur moyen d'ajouter des événements à l'application Calendrier à partir du projet open source Android consiste à ajouter l'événement à l'agenda Google de l'utilisateur via les API GData appropriées.


UPDATE

Android 4.0 (API de niveau 14) a ajouté une CalendarContractContentProvider.

20
CommonsWare

Essayez ceci dans votre 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

Utilisez cette API dans votre code. Il vous aidera à insérer un événement, un événement avec rappel et un événement avec réunion peuvent être activés ... Cette API fonctionne pour les plates-formes 2.1 et supérieures. Ceux qui utilisent moins de 2.1 au lieu de contenu: // com .Android.calendar/events utilise le contenu: // 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

j'ai utilisé le code ci-dessous, il résout mon problème d'ajouter un événement dans le calendrier de périphérique par défaut dans ICS et aussi sur la version moins que 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, "[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);
        }

J'espère que ça aiderait .....

55
Milan Shukla

À partir de Android version 4.0 , les API et les intentions officielles sont disponibles pour interagir avec le calendrier disponible . fournisseurs .

39
tobsen

Juste au cas où quelqu'un aurait besoin de ça pour Xamarin en 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);

Fonctions d'assistance:

    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

Essaye ça ,

   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 calendar est l'application de calendrier "native". Autant que je sache, tous les téléphones sont livrés avec une version installée et le SDK par défaut fournit une version.

Vous pouvez vérifier ceci tutoriel pour travailler avec cela.

7
Cheryl Simon

si vous avez une chaîne de date donnée avec date et heure.

par exemple, String givenDateString = pojoModel.getDate()/* Format dd-MMM-yyyy hh:mm:ss */

utilisez le code suivant pour ajouter un événement avec la date et l'heure au calendrier

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

vous devez ajouter un drapeau:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

ou vous causerez une erreur avec:

startActivity() de l'extérieur d'un contexte d'activité nécessite le FLAG_ACTIVITY_NEW_TASK

2
john vuong