web-dev-qa-db-fra.com

Obtenir des événements du calendrier

Mon problème est que je dois faire une application de démonstration dans laquelle je veux lire les événements du calendrier Google, pour cela j'ai inséré manuellement les événements comme le titre de l'événement, l'heure des événements et les détails de l'ensemble des événements. maintenant je dois juste lire ces événements depuis ce calendrier. Pour cela, j'ai essayé d'utiliser l'API gcode (code Google) qui fournit la classe d'API de calendrier. Mais je ne peux toujours pas lire ces événements.

25
Akash Thakkar

Ok, j'ai trouvé la réponse à cet ensemble du concept selon lequel utiliser l'intégration de l'application de calendrier Google avec le téléphone Android.

code:--

vous définissez d'abord cette ligne qui va lire les événements de calendrier de l'autre classe de votre classe qui est actuelle est ApplicationSettings.Java.

ReadCalendar.readCalendar(ApplicationSettings.this);

package com.mycalendarevents.Android;

import Java.util.Date;
import Java.util.HashSet;
import Java.util.regex.Pattern;

import Android.content.ContentResolver;
import Android.content.ContentUris;
import Android.content.Context;
import Android.database.Cursor;
import Android.net.Uri;
import Android.text.format.DateUtils;

public class ReadCalendar
{
    static Cursor cursor;

    public static void readCalendar(Context context) {

        ContentResolver contentResolver = context.getContentResolver();

        // Fetch a list of all calendars synced with the device, their display names and whether the

        cursor = contentResolver.query(Uri.parse("content://com.Android.calendar/calendars"),
                (new String[] { "_id", "displayName", "selected"}), null, null, null);

        HashSet<String> calendarIds = new HashSet<String>();

        try
        {
            System.out.println("Count="+cursor.getCount());
            if(cursor.getCount() > 0)
            {
                System.out.println("the control is just inside of the cursor.count loop");
                while (cursor.moveToNext()) {

                    String _id = cursor.getString(0);
                    String displayName = cursor.getString(1);
                    Boolean selected = !cursor.getString(2).equals("0");

                    System.out.println("Id: " + _id + " Display Name: " + displayName + " Selected: " + selected);
                    calendarIds.add(_id);
                }
            }
        }
        catch(AssertionError ex)
        {
            ex.printStackTrace();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }


        // For each calendar, display all the events from the previous week to the end of next week.        
        for (String id : calendarIds) {
            Uri.Builder builder = Uri.parse("content://com.Android.calendar/instances/when").buildUpon();
            //Uri.Builder builder = Uri.parse("content://com.Android.calendar/calendars").buildUpon();
            long now = new Date().getTime();

            ContentUris.appendId(builder, now - DateUtils.DAY_IN_MILLIS * 10000);
            ContentUris.appendId(builder, now + DateUtils.DAY_IN_MILLIS * 10000);

            Cursor eventCursor = contentResolver.query(builder.build(),
                    new String[]  { "title", "begin", "end", "allDay"}, "Calendars._id=" + 1,
                    null, "startDay ASC, startMinute ASC");

            System.out.println("eventCursor count="+eventCursor.getCount());
            if(eventCursor.getCount()>0)
            {

                if(eventCursor.moveToFirst())
                {
                    do
                    {
                        Object mbeg_date,beg_date,beg_time,end_date,end_time;

                        final String title = eventCursor.getString(0);
                        final Date begin = new Date(eventCursor.getLong(1));
                        final Date end = new Date(eventCursor.getLong(2));
                        final Boolean allDay = !eventCursor.getString(3).equals("0");

                        /*  System.out.println("Title: " + title + " Begin: " + begin + " End: " + end +
                                    " All Day: " + allDay);
                        */
                        System.out.println("Title:"+title);
                        System.out.println("Begin:"+begin);
                        System.out.println("End:"+end);
                        System.out.println("All Day:"+allDay);

                        /* the calendar control metting-begin events Respose  sub-string (starts....hare) */

                        Pattern p = Pattern.compile(" ");
                        String[] items = p.split(begin.toString());
                        String scalendar_metting_beginday,scalendar_metting_beginmonth,scalendar_metting_beginyear,scalendar_metting_begindate,scalendar_metting_begintime,scalendar_metting_begingmt;

                        scalendar_metting_beginday = items[0];
                        scalendar_metting_beginmonth = items[1];
                        scalendar_metting_begindate = items[2];
                        scalendar_metting_begintime = items[3];
                        scalendar_metting_begingmt = items[4];
                        scalendar_metting_beginyear = items[5];


                        String  calendar_metting_beginday = scalendar_metting_beginday;
                        String  calendar_metting_beginmonth = scalendar_metting_beginmonth.toString().trim();

                        int  calendar_metting_begindate = Integer.parseInt(scalendar_metting_begindate.trim());

                        String calendar_metting_begintime = scalendar_metting_begintime.toString().trim();
                        String calendar_metting_begingmt = scalendar_metting_begingmt;
                        int calendar_metting_beginyear = Integer.parseInt(scalendar_metting_beginyear.trim());


                        System.out.println("calendar_metting_beginday="+calendar_metting_beginday);

                        System.out.println("calendar_metting_beginmonth ="+calendar_metting_beginmonth);

                        System.out.println("calendar_metting_begindate ="+calendar_metting_begindate);

                        System.out.println("calendar_metting_begintime="+calendar_metting_begintime);

                        System.out.println("calendar_metting_begingmt ="+calendar_metting_begingmt);

                        System.out.println("calendar_metting_beginyear ="+calendar_metting_beginyear);

                          /* the calendar control metting-begin events Respose  sub-string (starts....ends) */  

                        /* the calendar control metting-end events Respose  sub-string (starts....hare) */

                        Pattern p1 = Pattern.compile(" ");
                        String[] enditems = p.split(end.toString());
                        String scalendar_metting_endday,scalendar_metting_endmonth,scalendar_metting_endyear,scalendar_metting_enddate,scalendar_metting_endtime,scalendar_metting_endgmt;

                        scalendar_metting_endday = enditems[0];
                        scalendar_metting_endmonth = enditems[1];
                        scalendar_metting_enddate = enditems[2];
                        scalendar_metting_endtime = enditems[3];
                        scalendar_metting_endgmt = enditems[4];
                        scalendar_metting_endyear = enditems[5];


                        String  calendar_metting_endday = scalendar_metting_endday;
                        String  calendar_metting_endmonth = scalendar_metting_endmonth.toString().trim();

                        int  calendar_metting_enddate = Integer.parseInt(scalendar_metting_enddate.trim());

                        String calendar_metting_endtime = scalendar_metting_endtime.toString().trim();
                        String calendar_metting_endgmt = scalendar_metting_endgmt;
                        int calendar_metting_endyear = Integer.parseInt(scalendar_metting_endyear.trim());


                        System.out.println("calendar_metting_beginday="+calendar_metting_endday);

                        System.out.println("calendar_metting_beginmonth ="+calendar_metting_endmonth);

                        System.out.println("calendar_metting_begindate ="+calendar_metting_enddate);

                        System.out.println("calendar_metting_begintime="+calendar_metting_endtime);

                        System.out.println("calendar_metting_begingmt ="+calendar_metting_endgmt);

                        System.out.println("calendar_metting_beginyear ="+calendar_metting_endyear);

                          /* the calendar control metting-end events Respose  sub-string (starts....ends) */

                        System.out.println("only date begin of events="+begin.getDate());
                        System.out.println("only begin time of events="+begin.getHours() + ":" +begin.getMinutes() + ":" +begin.getSeconds());


                       System.out.println("only date begin of events="+end.getDate());
                        System.out.println("only begin time of events="+end.getHours() + ":" +end.getMinutes() + ":" +end.getSeconds());

                        beg_date = begin.getDate();
                        mbeg_date = begin.getDate()+"/"+calendar_metting_beginmonth+"/"+calendar_metting_beginyear;
                        beg_time = begin.getHours();

                        System.out.println("the vaule of mbeg_date="+mbeg_date.toString().trim());
                        end_date = end.getDate();
                        end_time = end.getHours();


                        CallHandlerUI.metting_begin_date.add(beg_date.toString());
                        CallHandlerUI.metting_begin_mdate.add(mbeg_date.toString());

                        CallHandlerUI.metting_begin_mtime.add(calendar_metting_begintime.toString());

                        CallHandlerUI.metting_end_date.add(end_date.toString());
                        CallHandlerUI.metting_end_time.add(end_time.toString());
                        CallHandlerUI.metting_end_mtime.add(calendar_metting_endtime.toString());

                    }
                    while(eventCursor.moveToNext());
                }
            }
            break;
        }
    }
}

voici l'intégralité du code à publier qui lira simplement chaque événement de votre calendrier à l'aide de cette URL de publication qui est pour la version 2.2 et supérieure:

Uri.parse("content://com.Android.calendar/instances/when").buildUpon();

pl trouver la sous ces version inférieure à 2.2 dans Android et utiliser ces événements comme vous le souhaitez).

19
Akash Thakkar

Ce code ci-dessus est assez horrible (et il ne semble pas fonctionner dans ICS - certainement les noms de colonne sont différents)

La page ici: http://developer.Android.com/guide/topics/providers/calendar-provider.html

offre une bien meilleure vue d'ensemble. Un code (beaucoup) plus simple pour récupérer des calendriers:

public class CalendarContentResolver {
    public static final String[] FIELDS = { 
        CalendarContract.Calendars.NAME,
        CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,
        CalendarContract.Calendars.CALENDAR_COLOR,
        CalendarContract.Calendars.VISIBLE 
    };

    public static final Uri CALENDAR_URI = Uri.parse("content://com.Android.calendar/calendars");

    ContentResolver contentResolver;
    Set<String> calendars = new HashSet<String>();

    public  CalendarContentResolver(Context ctx) {
        contentResolver = ctx.getContentResolver();
    }

    public Set<String> getCalendars() {
        // Fetch a list of all calendars sync'd with the device and their display names
        Cursor cursor = contentResolver.query(CALENDAR_URI, FIELDS, null, null, null);

        try {
            if (cursor.getCount() > 0) {
                while (cursor.moveToNext()) {
                    String name = cursor.getString(0);
                    String displayName = cursor.getString(1);
                    // This is actually a better pattern:
                    String color = cursor.getString(cursor.getColumnIndex(CalendarContract.Calendars.CALENDAR_COLOR));
                    Boolean selected = !cursor.getString(3).equals("0");
                    calendars.add(displayName);  
                }
            }
        } catch (AssertionError ex) { /*TODO: log exception and bail*/ }

        return calendars;
    }
}

J'espère que cela t'aides!

21
Marco

Je suis conscient qu'il s'agit d'un ancien poste, mais j'ai trouvé l'inspiration pour optimiser la solution trouvée dans la réponse donnée par Akash Takkar si quelqu'un a besoin d'une solution dans un proche avenir.

Les problèmes


Plus précisément, j'ai trouvé quelques problèmes dans le code d'origine:

  1. La boucle de récupération des événements du calendrier s'est brisée de façon immatérielle
    • Par conséquent, seuls les événements du premier calendrier ont été récupérés
  2. Le premier événement de chaque calendrier a été ignoré à l'aide de eventCursor.moveToFirst (); qui passe ensuite directement à l'événement suivant dans la boucle while
  3. L'ID des calendriers n'a pas été défini correctement dans eventCursor
    • "Calendars._id =" + 1, devrait être "Calendars._id =" + id,
  4. Il serait difficile pour les autres de spécifier leur propre plage de temps
  5. La solution actuelle n'est pas orientée objet ce qui présenterait de nombreux avantages
  6. La lisibilité et la documentation ne sont pas les meilleures

La solution


J'ai créé une bibliothèque Github qui retourne une liste d'objets d'événement dans une plage de temps spécifiée qui peut être trouvée à:

https://github.com/david-laundav/CalendarService

Les fichiers source se trouvent sous "CalendarService/src/dk/CalendarService".

Cas d'utilisation

La solution elle-même contient deux méthodes différentes à des fins différentes.

Premier cas d'utilisation:

CalendarService.readCalendar(class.this)
// where class.this is either your class or the context

Cette méthode renvoie une liste d'événements pour +/- 1 jour

Deuxième cas d'utilisation:

Vous pouvez également spécifier votre propre plage horaire:

CalendarService.readCalendar(class.this, int days, int hours)

Un exemple pourrait être:

CalendarService.readCalendar(class.this, 2, 5)

Ce faisant, vous retournerez une liste d'événements de +/- 2 jours et +/- 5 heures.

Le service a été testé, mais dites-moi si vous rencontrez des problèmes.

8
Demitrian

Cet article est un peu ancien, mais voici une autre solution simple pour obtenir des données relatives au fournisseur de contenu Calendar dans Android:

Utilisez cette lib: https://github.com/EverythingMe/easy-content-providers

Et maintenant, obtenez tous les calendriers:

CalendarProvider calendarProvider = new CalendarProvider(context);
List<Calendar> calendars = calendarProvider.getCalendars().getList();

Chaque calendrier possède tous les champs, vous pouvez donc obtenir toutes les informations dont vous avez besoin: id, nom, calendarColor, ownerAccount, accountName, calendarAccessLevel,. ..

Ou, obtenez tous événements d'un calendrier spécifique:

List<Event> calendars = calendarProvider.getEvents(calendar.id).getList();

Et il y a aussi une option pour obtenir Rappels, participants, instances .

Il fonctionne avec des listes ou un curseur et là un exemple d'application pour voir à quoi il ressemble et fonctionne. En fait, il existe un support pour tous les fournisseurs de contenu Android comme: Contacts, SMS, Appels, ... Doc complet avec toutes les options: https://github.com/EverythingMe/easy-content-providers/wiki/Android-providers

J'espère que cela a aidé :)

5
sromku

Utilisez ce code pour obtenir les événements du calendrier pour une journée.

public static void readCalendarEvent(Context context) throws ParseException {

        ContentResolver contentResolver = context.getContentResolver();
        Calendar calendar = Calendar.getInstance();
        String dtstart = "dtstart";
        String dtend = "dtend";


        SimpleDateFormat    displayFormatter = new SimpleDateFormat("MMMM dd, yyyy (EEEE)");

         stime=displayFormatter.format(calendar.getTime());     

        SimpleDateFormat startFormatter = new SimpleDateFormat("MM/dd/yy");
        String dateString = startFormatter.format(calendar.getTime());

        long after = calendar.getTimeInMillis();
        SimpleDateFormat formatterr = new SimpleDateFormat("hh:mm:ss MM/dd/yy");
        Calendar endOfDay = Calendar.getInstance();
        Date dateCCC = formatterr.parse("23:59:59 " + dateString);
        endOfDay.setTime(dateCCC);






    cursor = contentResolver.query(Uri.parse("content://com.Android.calendar/events"), (new String[] { "calendar_id", "title", "description", "dtstart", "dtend","eventTimezone", "eventLocation" }), "(" + dtstart + ">" + after + " and " + dtend + "<" + endOfDay.getTimeInMillis() + ")", null, "dtstart ASC");


        /*String[] COLS={"calendar_id", "title", "description", "dtstart", "dtend","eventTimezone", "eventLocation"};

        cursor = contentResolver.query(


                CalendarContract.Events.CONTENT_URI, COLS,null, null, null);*/

        gCalendar = new ArrayList<GoogleCalendar>();
        try {


            if (cursor.getCount() > 0) {


                while (cursor.moveToNext()) {
                    GoogleCalendar googleCalendar = new GoogleCalendar();
                    gCalendar.add(googleCalendar);
                    int calendar_id = cursor.getInt(0);
                    googleCalendar.setCalendar_id(calendar_id);
                    String title = cursor.getString(1);
                    googleCalendar.setTitle(title);
                    String description = cursor.getString(2);
                    googleCalendar.setDescription(description);
                    String dtstart1 = cursor.getString(3);
                     dt=convertDate(dtstart1,"hh:mm:ss");

                    googleCalendar.setDtstart(dt);                  

                String dtend1 = cursor.getString(4);
                    googleCalendar.setDtend(dtend1);


                    String eventTimeZone=cursor.getString(5);
                    googleCalendar.setEventTimeZone(eventTimeZone);
                    String eventlocation = cursor.getString(6);

                    googleCalendar.setEventlocation(eventlocation);



                }
            }
        } catch (AssertionError ex) {
            ex.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
2
user2841300