相关疑难解决方法(0)

列出Android 4+中特定日期的事件(ALL_DAY问题)

我试图在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) + " - " …
Run Code Online (Sandbox Code Playgroud)

android android-calendar android-4.0-ice-cream-sandwich

26
推荐指数
1
解决办法
1574
查看次数

对于GMT + x区域,Android日历全天活动日期为一天

我写了一个简单的代码,使用官方网站上的教程将日常活动插入日历. http://developer.android.com/guide/topics/providers/calendar-provider.html

    ContentResolver cr = context.getContentResolver();
    ContentValues values = new ContentValues();
    values.put(Events.DTSTART, dueDate.getTime());
    values.put(Events.ALL_DAY, true);   
    values.put(Events.DTEND, dueDate.getTime());
    values.put(Events.TITLE, "Some Event");
    values.put(Events.CALENDAR_ID, mCalID);
    TimeZone tz = TimeZone.getDefault();
    values.put(Events.EVENT_TIMEZONE, tz.getID());
   Uri uri = cr.insert(Events.CONTENT_URI, values);
Run Code Online (Sandbox Code Playgroud)

我发现当我在运行4.03的Acer设备上打开Goog​​le Calendar应用程序时,输入的日期已经转回了1天.我当地的时区是Sydney,GMT + 10.

所以我去设置时将当地时区改为美国东部(GMT -5)并运行相同的代码并且日期没有变化.然后我将时区改为GMT + 2,伊斯坦布尔,日期也发生了变化.然后我改为伦敦GMT 0,没有转变.

当我进行非全天活动时,无论时区如何,都会将正确的时间输入日历.

我发现的最接近的错误报告是 http://code.google.com/p/android/issues/detail?id=14051

我在代码中遗漏了什么,或者其他人也遇到了这个问题.

编辑 使用内容解析程序读取事件数据时的进一步检查

  ContentResolver cr = context.getContentResolver();
Uri uri =  CalendarContract.Events.CONTENT_URI; 
String selection =CalendarContract.Events._ID + "=?";
String [] selectionArgs = new String[]{String.valueOf(eventID)}; 
Run Code Online (Sandbox Code Playgroud)

转换为日期时的长度值是正确的日期和时间,例如.2013年2月14日12.00 AEST(悉尼时间).因此,问题必须出在Google日历阅读这些值的方式中.当我从Android中的日历应用程序手动添加一整天活动,并使用内容解析程序读取时间时,它是AEST(悉尼时间)的日期和上午11点,相当于悉尼的+11 GMT关闭设置.因此,需要在GMT中输入全天事件以避免这种情况,但在文档中没有提到这一点.

所以现在我正在改变时间,以避免这个问题.

timezone android calendar google-calendar-api

14
推荐指数
1
解决办法
6889
查看次数