在Android日历中插入多个事件

时间:2011-12-31 15:08:31

标签: android events calendar

我无法找到解决问题的方法。我想在我的Android日历中添加多个事件,但我不知道如何。我发现了这段代码:

        Calendar cal = Calendar.getInstance();              
            Intent intent = new Intent(Intent.ACTION_EDIT);
            intent.setType("vnd.android.cursor.item/event");
            intent.putExtra("beginTime", cal.getTimeInMillis());
            intent.putExtra("allDay", true);
            intent.putExtra("rrule", "FREQ=YEARLY");
            intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000);
            intent.putExtra("title", "A Test Event from android app"+String.valueOf(i));
            startActivity(intent);

但它只是将我发送到我的日历并让我编辑并手动插入我的活动。我想自动插入事件,而无需转到我的日历应用程序。而且,我只能使用此代码添加一个事件。这不是我想要的。 我有2个String数组,一个包含日期,另一个包含事件的名称。 有谁知道有没有办法做到这一点?我一直在寻找解决方案很长一段时间没有找到解决方案。如果有人帮助过我,我将不胜感激。谢谢!

我已经解决了这个问题!非常感谢你!但现在我有另一个我无法解决的问题。 我有这段代码:

        ContentValues cv = new ContentValues();
        cv.put("calendar_id", calIds[0]);
        cv.put("title", title);
        //cv.put("dtstart", dtstart );
        //cv.put("dtend", dtend);
        cv.put("rrule", "FREQ=MONTHLY");
        cv.put("description", comment );
        Calendar start = Calendar.getInstance();
        start.set(2012, 0, 2, 8, 0, 0);

        Calendar end = Calendar.getInstance();
        end.set(2012, 0, 2, 9, 0, 0);

        long startTime = start.getTimeInMillis();       
        long endTime = end.getTimeInMillis();

        cv.put("dtstart", startTime);
        cv.put("dtend", endTime);
        //Insertion on the events of the calendar
        cr.insert(Uri.parse("content://com.android.calendar/events"), cv);

它会插入我的事件,但它不会重复出现。我的意思是我的活动出现在2jan2012但是在2jan2013上没有,2014年也没有,依此类推。所以我在手机上打开了我的日历,并尝试编辑我的活动,我看到我应该选择它的出现位置,它显示在2012年1月2日而不是1月2日,因为它应该从我的自定义我的活动电话。另一方面,如果我尝试从手机手动添加事件,它可以正常工作(我的意思是我可以添加每年发生的事件)。

2 个答案:

答案 0 :(得分:5)

Android SDK不公开任何接口来操纵日历,但你可以从android源代码中找到它。 Android将日历存储在内部sqlite数据库中,虽然它可以防止直接访问,但您仍然可以通过ContentResolver添加/删除/更新/查询日历数据。插入事件的一段代码可能是这样的:

public String addEvent(String calendarId, String title, long startTime,
        long endTime, int allDay) {
    ContentValues event = new ContentValues();
    event.put("calendar_id", calendarId); // "" for insert
    event.put("title", title);
    event.put("description", "");
    event.put("eventLocation", "");
    event.put("allDay", allDay);
    event.put("eventStatus", 1);
    event.put("transparency", 0);
    event.put("dtstart", startTime);
    event.put("dtend", endTime);

    ContentResolver contentResolver = this.context.getContentResolver();
    Uri eventsUri = Uri.parse("content://com.android.calendar/calendars");
    Uri url = contentResolver.insert(eventsUri, event);
    String ret = url.toString();
    return ret;
}

当您成功插入一个事件时,一个字符串表示ContentResolver.insert返回的事件的uri,您可以稍后查询,更新或删除它。在SDK 8之前的早期SDK中,日历的内容uri是“content:// calendar / calendars”,它与SDK 8及之后不同。
同时,要小心那些自定义的roms。由于SDK文档中未记录日历API,因此某些供应商和运营商可能会修改甚至删除日历提供程序,因此您可能必须针对大量设备测试您的应用程序。 祝你好运!

答案 1 :(得分:0)

 public Uri createEvent(int calId, ICalEvent event) {
        ContentValues eventValues = new ContentValues();

        eventValues.put("calendar_id", calId);
        eventValues.put("title", event.getSummary());
        eventValues.put("description", event.getDescription());
        eventValues.put("eventLocation", event.getLocation());

// eventValues.put("UID", "ADE52556e6976657273697465323031302f323031312d323637392d302d3131");
// originalEvent
        eventValues.put("originalEvent", event.getUid() + ";" + event.getLastModif().getTime() );

        long startTime = event.getStart().getTime();//System.currentTimeMillis() + 1000 * 60 * 60;
        long endTime = event.getEnd().getTime();//System.currentTimeMillis() + 1000 * 60 * 60 * 2;

        eventValues.put("dtstart", (event.isWholeDayEvent() ? endTime : startTime));
        eventValues.put("dtend", endTime);

        eventValues.put("allDay", (event.isWholeDayEvent() ? 1 : 0)); // 0 for false, 1 for true
        eventValues.put("eventStatus", 1);
        eventValues.put("visibility", 0);
        eventValues.put("transparency", 0);
        eventValues.put("hasAlarm", 0); // 0 for false, 1 for true

        System.out.println("USING SYNC ACCOUNT " + sync_account);

        eventValues.put("_sync_account_type", sync_account);

        Uri eventsUri = Uri.parse(getCalendarUriBase()+"events");

        Uri insertedUri = activity.getContentResolver().insert(eventsUri, eventValues);
        return insertedUri;
    }