Grz*_*ski 26 android android-calendar android-4.0-ice-cream-sandwich
我试图在Android 4+中选定的一天发生所有事件.
据我所知,CalendarContract.Instances是获取事件的最简单方法,因为它处理重复事件和单个时间事件.
但是,我在处理时间戳方面遇到了一些问题.具体而言,似乎以不同方式处理ALL_DAY事件.
我开始使用以下代码(start是我获取事件的那一天,毫秒"数学"是为了避免在第二天上午12点开始的不必要事件,日历使用默认时区).
public Cursor fetchCursor(Calendar start) {
Calendar end = (Calendar) start.clone();
end.add(Calendar.DATE, 1);
long startTime = start.getTimeInMillis() + 1;
long endTime = end.getTimeInMillis() - 1;
ContentResolver resolver = mContext.getContentResolver();
return CalendarContract.Instances.query(resolver, projection, startTime, endTime);
}
Run Code Online (Sandbox Code Playgroud)
这段代码似乎适用于许多边缘情况,不同的时区,跨越多天的事件......除了全天事件之外的所有事情.
当我用ALL_DAY标志检查返回的事件时:
Cursor c = fetchCursor(date);
Log.e("SIZE", String.valueOf(c.getCount()));
while (c.moveToNext()) {
long begin = c.getLong(2); // CalendarContract.Instances.BEGIN
long end = c.getLong(3); // CalendarContract.Instances.END
Date beginDate = new Date(begin);
Date endDate = new Date(end);
Log.e("EVENT", String.valueOf(begin) + " - " + String.valueOf(end));
Log.e("EVENT", beginDate.toString() + " - " + endDate.toString());
}
Run Code Online (Sandbox Code Playgroud)
我得到了:EVENT(10075): Thu Sep 13 02:00:00 CEST 2012 - Sat Sep 15 02:00:00 CEST 2012.
对我来说,看起来query预期范围从MY TIMEZONE中的纪元开始和以毫秒结束(但API声明它需要基于UTC的时间戳).但标记为ALL_DAY的事件自UTC时代开始使用millis(因此我因为+2时区而增加了2小时).
我也尝试过计算和添加时区偏移量.然后整天的活动都很好,但其他一切......不是.
private long getTimezoneOffset(TimeZone zone, long date) {
long delta = zone.getOffset(date);
return delta;
}
private long getTimeInUTC(Calendar date) {
long time = date.getTimeInMillis();
time += getTimezoneOffset(date.getTimeZone(), time);
return time;
}
public Cursor fetchCursor(Calendar start) {
Calendar end = (Calendar) start.clone();
end.add(Calendar.DATE, 1);
long startTime = getTimeInUTC(start) + 1;
long endTime = getTimeInUTC(end) - 1;
ContentResolver resolver = mContext.getContentResolver();
return CalendarContract.Instances.query(resolver, projection, startTime, endTime);
}
Run Code Online (Sandbox Code Playgroud)
虽然通过迭代游标,改变ALL_DAY事件和删除不必要的事件,可以很容易地解决这个问题,但我想知道是否有更好的方法.或者这可能是Android的bug?但如果它是一个错误,那么为什么系统日历工作正常?这种不一致的行为对我来说似乎很奇怪.
谢谢.
Calendarapi 也与某些设备相关,您的代码可以在其他设备中完美运行Android - 4.4.4 KitKat,但不能在其他设备中运行。以下代码在我测试过的所有设备上都能完美运行。
尝试这个:
public Cursor fetchCursor(Calendar start) {
Calendar end = (Calendar) start.clone();
end.add(Calendar.DATE, 1);
ContentResolver resolver = this.getContentResolver();
return CalendarContract.Instances.query(resolver, new String[] { "calendar_id", "title", "description",
"dtstart", "dtend", "eventLocation" }, start.getTimeInMillis(),
end.getTimeInMillis());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1574 次 |
| 最近记录: |