【问题标题】:Insert multiple events in Android calendar在 Android 日历中插入多个事件
【发布时间】:2012-01-31 02:37:57
【问题描述】:

我无法找到解决问题的方法。我正在尝试将多个事件添加到我的 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 个字符串数组,一个包含日期,一个包含事件名称。 有谁知道是否有办法做到这一点?我一直在寻找解决方案很长一段时间,但没有找到。如果有人帮助我,我将不胜感激。谢谢!

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

        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 日,因为它应该从我的自定义事件电话。另一方面,如果我尝试从我的手机手动添加一个事件,它工作得很好(我的意思是我可以添加一个每年发生的事件)。

【问题讨论】:

    标签: android events calendar


    【解决方案1】:

    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 及之后的版本不同。
    同时,请小心那些自定义 rom。由于 SDK 文档中没有注明日历 API,日历提供程序可能会被某些供应商和运营商修改甚至删除,因此您可能需要针对大量设备测试您的应用程序。
    祝你好运!

    【讨论】:

    • 其实他们终于在 ICS 中添加了官方的 Calendar API:developer.android.com/reference/android/provider/…
    • 感谢@mbaird,这真是一个好消息!我有一段时间没在android上工作了,我应该赶上最新的版本。
    • 我已经解决了这个问题,但现在我遇到了另一个问题。如果您能再帮助我一次,我将不胜感激......我已经编辑了关于另一个问题的问题。
    • 我没有写这样的代码来创建重复事件,但我猜是rrule的值引起的,“FREQ=MONTHLY”看起来不像一个rfc 2445字符串,检查它是否是一个有效的字符串反对rfc。仅供您参考。
    【解决方案2】:
     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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      相关资源
      最近更新 更多