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

159

Je suis juste en train de me mettre au courant sur Android, et aujourd'hui, lors d'une réunion de projet, quelqu'un a déclaré qu'Android n'avait pas d'application de calendrier native, donc les utilisateurs utilisent simplement l'application de calendrier qu'ils aiment.

Est-ce vrai, et si oui, 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 ça vaut, nous ciblons probablement Android 2.x.

Peter Nelson
la source
Vous devriez probablement accepter la réponse d'Oriharel puisqu'il fournit le code pour accomplir votre tâche.
jww
1
@SumitSharma votre lien ne semble plus fonctionner - et semble assez suspect avec la boîte de dialogue d'installation automatique.
fixer le

Réponses:

17

comment 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 aucune 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 Calendar du projet open source Android, que Mayra cite, ne propose aucune API documentée et prise en charge. Google a même explicitement dit aux développeurs de ne pas utiliser les techniques décrites dans le didacticiel cité par Mayra.

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


METTRE À JOUR

Android 4.0 (niveau d'API 14) a ajouté un CalendarContract ContentProvider.

CommonsWare
la source
6
Nous ne voulons pas cibler un calendrier spécifique - nous voulons simplement être en mesure d'ajouter des événements à n'importe quel calendrier que l'utilisateur utilise, par souci de commodité pour l'utilisateur. Notre application fournit une interface vers un site Web qui organise des réunions et des conférences professionnelles. Donc, si quelqu'un s'inscrit pour un, ce serait bien de l'afficher dans son calendrier.
Peter Nelson
3
@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 pour la commodité de l'utilisateur." - vous ne pouvez pas le faire plus sur Android que sur Windows. Sur aucune des deux plates-formes, vous ne savez "quel que soit le calendrier utilisé par l'utilisateur", et sur aucune des deux plates-formes il n'y a une API universelle pour travailler avec une telle application de calendrier.
CommonsWare
22
Je ne sais pas pourquoi vous continuez à le comparer à Windows - Tous ceux que je connais utilisent leur téléphone pour organiser leurs horaires et leurs rendez-vous - je ne connais personne qui le fait sur leur PC - peut-être que c'est une chose générationnelle. Mais je comprends qu'Android ne peut pas faire ça. Merci.
Peter Nelson
5
@Peter Nelson: Je continue de le comparer à Windows parce que les gens font les mêmes hypothèses. De nombreux développeurs pensent qu'ils peuvent «ajouter des événements à n'importe quel calendrier que l'utilisateur utilise» sous Windows, car ils pensent que tout le monde utilise Outlook et qu'il n'y a donc qu'un «n'importe quel calendrier».
CommonsWare
1
@Yar: "Le calendrier principal des téléphones Android, que possède n'importe quel téléphone Android." - sauf pour tous les appareils Android qui n'ont pas cette application. Par exemple, de nombreux appareils HTC n'ont pas cette application, mais ont plutôt leur propre application de calendrier, comme le HTC DROID Incredible six pouces à ma gauche. Les fabricants d'appareils sont invités à remplacer l'application de calendrier - ou à peu près toute autre application - par leur propre implémentation.
CommonsWare
290

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);
oriharel
la source
6
J'aime beaucoup cette solution. Principalement parce que cela pousse l'utilisateur à sélectionner son propre calendrier (s'il en a plus d'un).
Sebastian Roth
2
comment rendre cela compatible pour Android 2.2?
Srikanth Pai
13
Vous devriez utiliser .setData (CalendarContract.Events.CONTENT_URI) au lieu de setType, car avec setType (string), il plantera sur certains appareils!
Informatic0re
4
Tutoriel complet ici: code.tutsplus.com/tutorials / ... Il vaut mieux utiliser des constantes pour éviter les fautes de frappe;)
Adrien Cadet
7
Votre code indique à votre application d'envoyer des données à une autre application (de calendrier) qui utilise ensuite ces données pour ajouter un nouvel événement de calendrier. Votre application n'écrit ni ne lit les données de calendrier, vous n'avez donc besoin d'aucune autorisation dans le manifeste.
Chanté
66

Utilisez cette API dans votre code .. Cela 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 plate-forme 2.1 et supérieure Ceux qui utilisent moins de 2.1 au lieu de contenu: // com .android.calendar / events use content: // calendrier / événements

 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
la source
4
J'ai ajouté event.put("eventTimezone", "UTC/GMT +2:00")et éliminé event.put("visibility", 3)et event.put("transparency", 0)et cela fonctionne bien
valide du
1
Peut-être obtenir une erreur de fuseau horaire. J'ajoute ceci et ses travaux eventValues.put ("eventTimezone", TimeZone.getDefault (). GetID ());
Cüneyt le
2
Je suis android.database.sqlite.SQLiteExceptionen ligneUri reminderUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(reminderUriString), reminderValues);
Sibidharan
1
mais un quand je règle values.put ("rrule", "FREQ = DAILY"); et définissez endDate, cela ne fonctionne pas. événement défini pour tous les jours jusqu'à la date de fin. @AmitabhaBiswas
urvi joshi
1
values.put (CalendarContract.Reminders.CALENDAR_ID, 1); values.put (CalendarContract.Reminders.TITLE, "Routine Everyday1"); values.put (CalendarContract.Reminders.DTSTART, millisecondesTimesEveryday); values.put (CalendarContract.Reminders.HAS_ALARM, true); values.put ("règle", "FREQ = QUOTIDIEN"); // UNTIL = 1924885800000 values.put (CalendarContract.Reminders.DTEND, EndtimeInMilliseconds); @AmitabhaBiswas
urvi joshi
57

J'ai utilisé le code ci-dessous, cela résout mon problème pour ajouter un événement dans le calendrier de l'appareil par défaut dans ICS et également 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 cela aiderait .....

Milan Shukla
la source
à propos de Build.VERSION.SDK_INT> 14, comment puis-je ajouter un rappel par défaut pendant 60 min et comment puis-je obtenir l'ID du rappel? Merci
user1796624
Salut, je me demandais s'il était possible de modifier l'écran qui affiche les champs de calendrier modifiables (comme modifier l'apparence de certaines vues)?
Yulric Sequeira
@ user1950599 Certainement pas. L'intention démarre une activité à partir d'une autre application et la seule interaction avec elle est les données que vous envoyez via l'intention.
Pijusn
8

Juste au cas où quelqu'un en aurait besoin 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;
    }
dotsa
la source
7

Google Agenda est l'application de calendrier "native". Pour autant que je sache, tous les téléphones sont livrés avec une version installée, et le SDK par défaut en fournit une version.

Vous pouvez consulter ce didacticiel pour l'utiliser.

Cheryl Simon
la source
7

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

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

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

utilisez le code suivant pour ajouter un événement avec date et 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);
Arun
la source
3

vous devez ajouter un drapeau:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

ou vous causerez une erreur avec:

startActivity() hors d'un contexte d'activité nécessite le FLAG_ACTIVITY_NEW_TASK

John Vuong
la source