166 votes

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 dit qu'Android n'avait pas d'application de calendrier native et que les utilisateurs utilisaient simplement l'application de calendrier de leur choix.

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

Pour ce que ça vaut, nous visons probablement Android 2.x.

0 votes

Vous devriez probablement accepter la réponse d'oriharel puisqu'il fournit le code pour accomplir votre tâche.

1 votes

@SumitSharma votre lien ne semble plus fonctionner -- et semble assez suspect avec le dialogue d'installation automatique.

299voto

oriharel Points 3489

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

6 votes

J'aime beaucoup cette solution. Principalement parce qu'elle pousse l'utilisateur à sélectionner son propre calendrier (s'il en a plusieurs).

1 votes

Merci. C'est exécutable dans mon application :)

1 votes

Merci. Cela fonctionne-t-il aussi avec sense ? Pas d'absurdité avec HTC qui remplace les calendriers, etc ?

66voto

Pradeep Points 956

Utilisez cette API dans votre code... Elle vous aidera à insérer un événement, un événement avec rappel et un événement avec réunion peut être activé... Cette API fonctionne pour la plateforme 2.1 et plus. Ceux qui utilisent moins de 2.1 au lieu de content://com.Android.calendar/events utiliser 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;

}

0 votes

Ce code ne fonctionne pas pour moi, quelqu'un peut-il me fournir la solution appropriée pour le même problème ?

0 votes

01-11 16:06:01.928 : E/AndroidRuntime(24027) : java.lang.IllegalArgumentException : Les valeurs d'événement doivent inclure un eventTimezone

4 votes

J'ai ajouté event.put("eventTimezone", "UTC/GMT +2:00") et éliminé event.put("visibility", 3) y event.put("transparency", 0) et cela fonctionne bien

59voto

Milan Shukla Points 549

J'ai utilisé le code ci-dessous, il résout mon problème pour ajouter un événement dans le calendrier par défaut de l'appareil dans ICS et aussi sur la version inférieure à 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);
        }

J'espère que cela vous aidera.....

0 votes

À propos du Build.VERSION.SDK_INT > 14, comment puis-je ajouter un rappel par défaut pour 60 min et comment puis-je obtenir l'Id du rappel ? Merci

0 votes

Bonjour, je me demandais s'il était possible de modifier l'écran qui affiche les champs de calendrier modifiables (comme changer l'apparence de certaines vues) ?

0 votes

@user1950599 Certainement pas. L'intention lance une activité à partir d'une autre application et la seule interaction avec celle-ci est constituée par les données que vous envoyez via l'intention.

41voto

tobsen Points 3776

À partir de la version 4.0 d'Android les API et les intents officiels sont disponibles pour interagir avec les fournisseurs de calendrier .

4 votes

Commentaire très utile, je ne peux pas le souligner assez :)

1 votes

Peut-être pouvez-vous fournir un code pour accompagner la réponse en lien seulement ?

16voto

CommonsWare Points 402670

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

Quel calendrier ?

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

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

S'il existe des applications de calendrier spécifiques avec lesquelles vous souhaitez vous intégrer, contactez leurs développeurs et déterminez s'ils proposent une API. Ainsi, par exemple, l'application Calendrier du projet open source Android, que Mayra cite, ne propose aucune API documentée et prise en charge. Google a même a explic explicitement dit aux développeurs de ne pas utiliser les techniques décrite dans le tutoriel que Mayra cite.

Une autre possibilité consiste à ajouter des événements au calendrier Internet en question. Par exemple, la meilleure façon d'ajouter des événements à l'application Calendrier du projet open source Android est d'ajouter l'événement au calendrier Google de l'utilisateur via les API GData appropriées.


UPDATE

Android 4.0 (API Niveau 14) a ajouté une CalendarContract ContentProvider .

7 votes

Nous ne voulons pas cibler un calendrier spécifique - nous voulons simplement être en mesure d'ajouter des événements à n'importe quel calendrier utilisé par l'utilisateur, par souci de commodité. Notre application fournit une interface à un site Web qui organise des réunions et des conférences professionnelles. Ainsi, si quelqu'un s'inscrit à l'une d'elles, il serait agréable de l'ajouter à son calendrier.

0 votes

Je pense que l'utilisation de l'api non officielle est actuellement la meilleure façon de le faire, même si Google la décourage.

4 votes

@Peter Nelson : "Nous ne voulons pas cibler un calendrier spécifique - nous voulons juste être en mesure d'ajouter des événements à n'importe quel calendrier que l'utilisateur utilise, juste par commodité pour l'utilisateur." -- vous ne pouvez pas faire cela sur Android, pas plus que vous ne pouvez le faire sur Windows. Sur aucune des deux plates-formes vous ne connaissez "le calendrier que l'utilisateur utilise", et sur aucune des plates-formes il n'existe une API universelle pour travailler avec une telle application de calendrier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X