安卓日历事件未显示

6

你好,我有以下代码来添加我的日历事件:

public String addCalendarEntry(CalendarDTO calendar) {

        ContentValues event = new ContentValues();
        ContentResolver cr = getContentResolver();

        long startMillis = calendar.getStartDate().getTimeInMillis();
        long endMillis = calendar.getEndDate().getTimeInMillis();
        String timeZone = TimeZone.getDefault().getID();

        event.put(CalendarContract.Events.CALENDAR_ID, calendar.getId());
        event.put(CalendarContract.Events.TITLE, calendar.getTitle());
        event.put(CalendarContract.Events.DESCRIPTION, calendar.getDescription());
        event.put(CalendarContract.Events.EVENT_LOCATION, calendar.getLocation());
        event.put(CalendarContract.Events.DTSTART, startMillis);
        event.put(CalendarContract.Events.DTEND, endMillis);
        event.put(CalendarContract.Events.ALL_DAY, Boolean.getBoolean(String.valueOf(calendar.isAllDay())));   // 0 for false, 1 for true
        event.put(CalendarContract.Events.HAS_ALARM, 1); // 0 for false, 1 for true
        event.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone);

        Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, event);

        return uri.getLastPathSegment();
}

这段代码之前一直很正常,但突然之间就不再添加新的日历事件了。也没有出现任何错误提示,所以我现在有些困惑。

CalendarDTO只是一个数据传输类:

public class CalendarDTO {
    int id;
    String title;
    String description;
    String location;
    Calendar startDate;
    Calendar endDate;
    boolean isAllDay;

// getters and setters removed for brevity
}

任何线索都非常感谢。

我已经尝试了,但这并不一定回答了我的问题。你只是提出了一个替代方案。我不会给你点踩,因为你尝试帮助我,但除非你确定Android版本有问题,否则替代方案并不是答案。 - Marcos Placona
好的,先生。我已经删除了我的回答。 - Maveňツ
1个回答

6

请确认是否存在一个带有 calendar.getId() 的日历?

根据文档:http://developer.android.com/reference/android/provider/CalendarContract.Events.html

写入事件 对于Events表中的所有更新和插入都有进一步的限制:

如果allDay设置为1,则eventTimezone必须为TIMEZONE_UTC,并且时间必须对应于午夜边界。

可以尝试使用以下代码:

event.put(CalendarContract.Events.CALENDAR_ID, calendar.getId());
    event.put(CalendarContract.Events.TITLE, calendar.getTitle());
    event.put(CalendarContract.Events.DESCRIPTION, calendar.getDescription());
    event.put(CalendarContract.Events.EVENT_LOCATION, calendar.getLocation());
    if(calendar.isAllDay){
        Calendar start=calendar.getStartDate();
        start.set(Calendar.HOUR_OF_DAY, 0);
        start.set(Calendar.MINUTE, 0);
        start.set(Calendar.SECOND, 0);
        start.set(Calendar.MILLISECOND, 0);
        Calendar end=start;
        end.add(Calendar.DAY_OF_MONTH,1);
        event.put(CalendarContract.Events.DTSTART, start.getTimeInMillis());
        event.put(CalendarContract.Events.DTEND, end.getTimeInMillis());
        event.put(CalendarContract.Events.EVENT_TIMEZONE, Time.TIMEZONE_UTC);
    }else{
        event.put(CalendarContract.Events.DTSTART, startMillis);
        event.put(CalendarContract.Events.DTEND, endMillis);
        event.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone);
    }
    event.put(CalendarContract.Events.HAS_ALARM, 1);
    event.put(CalendarContract.Events.ALL_DAY, calendar.isAllDay()?1:0);

我会尝试并回报结果,但是我认为你可能有一些想法。谢谢。 - Marcos Placona
@MarcosPlacona,如果这不能帮到你,请告诉我,我会删除答案,以便你能得到更好的答案。 - isma3l
你说得完全正确,我在文档中完全忽略了这一点。这真的救了我的命!谢谢 @isma3l - Marcos Placona

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接