Abrufen von Ereignissen aus dem Kalender

Mein Problem ist, ich muss eine Demo-Anwendung machen, in der ich die Ereignisse des Google-Kalenders lesen möchte, für die ich manuell die Ereignisse wie den Titel des Ereignisses, die Zeit der Ereignisse und die Details der ganzen Ereignisse einfüge. Jetzt muss ich nur diese Ereignisse diesen Kalender bilden. dafür habe ich versucht, den gcode (google code) api zu verwenden, der die kalender api klasse liefert. aber immer noch kann ich diese Ereignisse nicht lesen.

   

Dieser Code ist ziemlich schrecklich (und es scheint nicht in ICS zu funktionieren – definitiv sind die Spaltennamen unterschiedlich)

Die Seite hier: http://developer.android.com/guide/topics/providers/calendar-provider.html

bietet einen viel besseren Überblick. Ein (viel) einfacherer Code zum Abrufen von Kalendern:

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 calendars = new HashSet(); public CalendarContentResolver(Context ctx) { contentResolver = ctx.getContentResolver(); } public Set 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; } } 

Hoffe das hilft!

Ok, ich fand die Antwort auf das ganze Konzept, wie man die Google Kalender Anwendung Integration mit dem Android-Handy verwenden kann.

Code:–

Zuerst legen Sie diese Zeile fest, die die Kalenderereignisse der anderen classnform Ihrer class liest, die aktuell ist, ist 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 calendarIds = new HashSet(); 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; } } } 

Hier ist der gesamte Code zu veröffentlichen, der einfach alle Ereignisse aus Ihrem Kalender mit Hilfe dieser Postback-URL liest, die für Version 2.2 und höher ist:

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

pl finde die unter dieser Version niedriger als 2,2 in android und nutze diese Ereignisse wie du es benötigst …

Mir ist bewusst, dass dies ein alter Beitrag ist, aber ich fand Inspiration für die Optimierung der Lösung, die in der Antwort von Akash Takkar gefunden wurde, wenn jemand in naher Zukunft eine Lösung benötigt.

Die Probleme


Insbesondere habe ich einige Probleme im Originalcode gefunden:

  1. Die Schleife zum Abrufen von Kalenderereignissen brach unreif
    • Hiermit wurden nur Ereignisse aus dem ersten Kalender abgerufen
  2. Das erste Ereignis in jedem Kalender wurde mit eventCursor.moveToFirst () übersprungen; welches sich danach direkt zum nächsten Ereignis in der while-Schleife bewegt
  3. Die ID der Kalender wurde im eventCursor nicht korrekt festgelegt
    • “Calendars._id =” + 1, sollte “Calendars._id =” + id sein,
  4. Es wäre schwierig für andere, ihren eigenen Zeitbereich festzulegen
  5. Die derzeitige Lösung ist nicht objektorientiert, was viele Vorteile hätte
  6. Die Lesbarkeit und Dokumentation ist nicht die beste

Die Lösung


Ich habe hiermit eine Github-Bibliothek erstellt, die eine Liste von Ereignisobjekten in einem bestimmten Zeitbereich zurückgibt, die zu finden sind unter:

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

Die Quelldateien finden Sie unter “CalendarService / src / dk / CalendarService”.

Anwendungsfälle

Die Lösung selbst enthält zwei verschiedene Methoden für verschiedene Zwecke.

Erster Anwendungsfall:

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

Diese Methode gibt eine Liste von Ereignissen für +/- 1 Tag zurück

Zweiter Anwendungsfall:

Sie können auch Ihren eigenen Zeitraum angeben:

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

Ein Beispiel könnte sein:

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

Dadurch wird eine Liste der Ereignisse von +/- 2 Tagen und +/- 5 Stunden zurückgegeben.

Der Service wurde getestet, aber bitte sagen Sie mir, wenn Sie Probleme haben.

Dieser Beitrag ist ein wenig alt, aber hier ist eine weitere einfache Lösung zum Abrufen von Daten im Zusammenhang mit Calendar Content-Anbieter in Android:

Verwenden Sie diese Bibliothek: https://github.com/EverythingMe/easy-content-providers

Und jetzt, hol dir alle Kalender:

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

Jeder Kalender verfügt über alle Felder, sodass Sie alle benötigten Informationen erhalten können: ID, Name, Kalenderfarbe, Besitzerkonto, KontoName, KalenderZugriffsebene, …

Oder erhalten Sie alle Ereignisse eines bestimmten Kalenders:

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

Und es gibt auch die Möglichkeit, Erinnerungen, Teilnehmer, Instanzen zu erhalten .

Es funktioniert mit Listen oder Cursor und dort eine Beispiel-App, um zu sehen, wie es aussieht und funktioniert. In der Tat gibt es Unterstützung für alle Android-Content-Provider wie: Kontakte, SMS, Anrufe, … Vollständige Dokumentation mit allen Optionen: https://github.com/EverythingMe/easy-content-providers/wiki/Android-providers

Hoffe es hat geholfen 🙂

Verwenden Sie diesen Code, um die Kalenderereignisse für einen Tag abzurufen.

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