Come aggiungere eventi di calendario in Android?


159

Mi sto solo aggiornando su Android, e oggi in una riunione di progetto qualcuno ha detto che Android non ha un'app di calendario nativa, quindi gli utenti usano semplicemente l'app di calendario che preferiscono.

È vero, e se sì, come posso aggiungere a livello di programmazione un evento al calendario dell'utente? Esiste un'API comune che condividono tutti?

Per quello che vale, probabilmente stiamo prendendo di mira Android 2.x.


Probabilmente dovresti accettare la risposta di oriharel poiché fornisce il codice per eseguire il tuo compito.
jww

1
@SumitSharma il tuo link sembra non funzionare più - e sembra piuttosto sospetto con la finestra di installazione automatica.
risolto il

Risposte:


17

come posso aggiungere a livello di programmazione un evento al calendario dell'utente?

Quale calendario?

Esiste un'API comune che condividono tutti?

No, non più di quanto non esista una "API comune che condividono tutti" per le app di calendario di Windows. Esistono alcuni formati di dati comuni (ad es. ICalendar) e protocolli Internet (ad es. CalDAV), ma nessuna API comune. Alcune app di calendario non offrono nemmeno un'API.

Se ci sono applicazioni di calendario specifiche che desideri integrare, contatta i loro sviluppatori e determina se offrono un'API. Quindi, ad esempio, l'applicazione Calendar del progetto open source Android, citata da Mayra, non offre API documentate e supportate. Google ha persino esplicitamente detto agli sviluppatori di non utilizzare le tecniche descritte nel tutorial citato da Mayra.

Un'altra opzione è quella di aggiungere eventi al calendario Internet in questione. Ad esempio, il modo migliore per aggiungere eventi all'applicazione Calendar dal progetto open source Android è aggiungere l'evento al Google Calendar dell'utente tramite le API GData appropriate.


AGGIORNARE

Android 4.0 (API Level 14) ha aggiunto a CalendarContract ContentProvider.


6
Non vogliamo targetizzare un calendario specifico - vogliamo solo essere in grado di aggiungere eventi a qualunque calendario utilizzi l'utente, proprio per comodità dell'utente. La nostra app fornisce un'interfaccia a un sito Web che organizza riunioni e conferenze professionali. Quindi, se qualcuno si iscrive per uno, sarebbe bello inserirlo nel loro calendario.
Peter Nelson,

3
@Peter Nelson: "Non vogliamo targetizzare un calendario specifico - vogliamo solo essere in grado di aggiungere eventi a qualunque calendario l'utente sta usando, proprio per comodità dell'utente." - non puoi farlo su Android più di quanto non puoi farlo su Windows. Su nessuna piattaforma conosci "qualunque sia il calendario che l'utente sta usando" e su nessuna piattaforma esiste un'API universale per lavorare con tale applicazione di calendario.
CommonsWare,

22
Non so perché continui a confrontarlo con Windows - Tutti quelli che conosco usano il proprio telefono per organizzare i loro programmi e appuntamenti - Non conosco nessuno che lo faccia sul proprio PC - forse è una cosa generazionale. Ma ho capito che Android non può farlo. Grazie.
Peter Nelson,

5
@Peter Nelson: continuo a confrontarlo con Windows perché le persone fanno gli stessi presupposti. Molti sviluppatori pensano di poter "aggiungere eventi a qualsiasi calendario l'utente sta utilizzando" su Windows, perché pensano che tutti utilizzino Outlook e quindi esiste un solo "qualunque calendario".
Commons War

1
@Yar: "Il calendario principale del telefono Android, che ha qualsiasi telefono Android." - ad eccezione di tutti i dispositivi Android che non dispongono di tale app. Ad esempio, molti dispositivi HTC non dispongono di tale app, ma piuttosto di una propria app di calendario, come l'HTC DROID Incredible da sei pollici alla mia sinistra. I produttori di dispositivi sono invitati a sostituire l'app di calendario - o qualsiasi altra app - con la propria implementazione.
CommonsWare,

290

Prova questo nel tuo codice:

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
Mi piace molto questa soluzione. Principalmente perché spinge l'utente a selezionare il proprio calendario (se ne ha più di uno).
Sebastian Roth,

2
come renderlo compatibile per Android 2.2?
Srikanth Pai,

13
Dovresti usare .setData (CalendarContract.Events.CONTENT_URI) invece di setType, perché con setType (stringa) andrà in crash su alcuni dispositivi!
Informatic0re

4
Tutorial completo qui: code.tutsplus.com/tutorials/… È meglio usare costanti per evitare errori di battitura;)
Adrien Cadet

7
Il codice indica alla tua app di inviare dati a un'altra app (calendario) che quindi utilizza tali dati per aggiungere un nuovo evento del calendario. L'app non scrive né legge i dati del calendario, quindi non è necessaria alcuna autorizzazione nel manifest.
Cantato il

66

Usa questa API nel tuo codice .. Ti aiuterà a inserire eventi, eventi con promemoria ed eventi con meeting possono essere abilitati ... Questo API funziona per la piattaforma 2.1 e successive Chi usa meno di 2.1 invece di content: // com .android.calendar / events usa 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;

}

4
Ho aggiunto event.put("eventTimezone", "UTC/GMT +2:00")ed eliminato event.put("visibility", 3)e event.put("transparency", 0)funziona bene
validcat

1
Forse ricevi un errore nel fuso orario. Aggiungo questo e le sue opere eventValues.put ("eventTimezone", TimeZone.getDefault (). GetID ());
Cüneyt,

2
Mi metto android.database.sqlite.SQLiteExceptionin filaUri reminderUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(reminderUriString), reminderValues);
Sibidharan,

1
ma uno quando ho impostato valori.put ("rrule", "FREQ = DAILY"); e impostare endDate, non funziona. evento impostato per tutti i giorni non fino alla data di fine. @AmitabhaBiswas
urvi joshi

1
valori.put (CalendarContract.Reminders.CALENDAR_ID, 1); valori.put (CalendarContract.Reminders.TITLE, "Routine Everyday1"); valori.put (CalendarContract.Reminders.DTSTART, millisecondiTimesEveryday); valori.put (CalendarContract.Reminders.HAS_ALARM, true); valori.put ("rrule", "FREQ = DAILY"); // UNTIL = 1924885800000 valori.put (CalendarContract.Reminders.DTEND, EndtimeInMilliseconds); @AmitabhaBiswas
urvi joshi

57

ho usato il codice qui sotto, risolve il mio problema per aggiungere un evento nel calendario del dispositivo predefinito in ICS e anche nella versione meno di 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);
        }

Spero che possa aiutare .....


su Build.VERSION.SDK_INT> 14, come posso aggiungere un promemoria predefinito per 60 minuti e come posso ottenere l'ID del promemoria? Grazie
user1796624

Ciao, mi chiedevo se fosse possibile modificare la schermata che mostra i campi del calendario modificabili (come cambiare l'aspetto di alcune visualizzazioni)?
Yulric Sequeira,

@ user1950599 Sicuramente no. L'intento avvia un'attività da un'altra applicazione e l'unica interazione con essa è i dati inviati tramite l'intento.
Pijusn,


8

Nel caso in cui qualcuno ne abbia bisogno per Xamarin in 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);

Funzioni di supporto:

    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

Google Calendar è l'app di calendario "nativa". Per quanto ne so, tutti i telefoni dispongono di una versione installata e l'SDK predefinito fornisce una versione.

Potresti dare un'occhiata a questo tutorial per lavorarci.


7

Prova questo ,

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

4

se hai una data stringa data con data e ora.

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

utilizzare il seguente codice per aggiungere un evento con data e ora al calendario

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

3

devi aggiungere flag:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

o causerai errori con:

startActivity() dall'esterno di un contesto di attività richiede il FLAG_ACTIVITY_NEW_TASK

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.