从日历获取事件

我的问题是,我不得不做一个演示应用程序,其中我想读取谷歌日历的事件,因为我已经手动插入事件的标题,事件的时间和整个事件的细节事件。 现在我需要只是那些日历forms的事件。 为此,我试图使用提供日历api类的gcode(google code)api。 但仍然无法读取这些事件

上面的代码是非常糟糕的(它似乎并没有在ICS中工作 – 绝对列名称是不同的)

这里的网页: http : //developer.android.com/guide/topics/providers/calendar-provider.html

提供了一个更好的概述。 检索日历的(很简单)代码:

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

希望这可以帮助!

好吧,我find了这个整个概念的答案,如何使用谷歌日历应用程序与Android手机的集成。

码: –

首先你要设置这一行来读取日历事件forms的其他类forms你的类当前是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; } } } 

这里是整个代码将被发布,它将简单地读取每个事件forms的日历与该回发url为2.2和以上版本的帮助:

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

PLfind在那些版本低于2.2在Android下,并使用这些事件,因为你需要的地方…

我知道这是一个旧的post,但是我发现如果有人在不久的将来需要解决scheme的话,我会find灵感来优化Akash Takkar给出的答案。

问题


具体来说,我在原始代码中发现了一些问题:

  1. 检索日历事件的循环不成熟
    • 因此,只有第一个日历的事件才被检索到
  2. 每个日历中的第一个事件通过使用eventCursor.moveToFirst(); 之后直接转到while循环中的下一个事件
  3. eventCursor中的日历ID未正确设置
    • “Calendars._id =”+ 1,应该是“Calendars._id =”+ id,
  4. 别人很难指定自己的时间范围
  5. 目前的解决scheme不是面向对象的,这将具有许多优点
  6. 可读性和文档不是最好的

解决scheme


我在这里创build了一个Github库,它返回一个指定时间范围内的事件对象列表,可以在这里find:

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

源文件可以在“CalendarService / src / dk / CalendarService”下find。

用例

解决scheme本身包含两个不同的方法用于不同的目的

第一个用例:

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

此方法将返回+/- 1天的事件列表

第二个用例:

您也可以指定自己的时间范围:

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

一个例子可能是:

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

这样做会返回一个+/- 2天和+/- 5小时的事件列表。

该服务已经过testing,但请告诉我,如果您遇到任何问题。

这篇文章有点旧了,但这里是另一个简单的解决scheme,用于获取Android中与Calendar内容提供者相关的数据:

使用这个lib: https : //github.com/EverythingMe/easy-content-providers

现在,获取所有日历:

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

每个日历都有所有的字段,所以你可以得到你需要的任何信息: id,name,calendarColor,ownerAccount,accountName,calendarAccessLevel,…

或者,获取特定日历的所有事件

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

也有select提醒,参加者,实例

它适用于列表或光标,并有一个示例应用程序,看看它的外观和工作。 事实上,所有的Android内容提供商都支持: Contacts(联系人),SMS(短信),Calls(电话)…具有所有选项的全文档: https : //github.com/EverythingMe/easy-content-providers/wiki/Android-providers

希望它帮助:)

使用此代码获取一天的日历事件。

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