Вставить несколько событий в календарь Android - PullRequest
7 голосов
/ 31 декабря 2011

У меня проблемы с поиском решения моей проблемы. Я пытаюсь добавить несколько событий в календарь 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 году, и так далее. Таким образом, я открыл свой календарь на телефоне и попытался отредактировать свое событие, и я увидел, что там, где я должен выбрать его событие, там он отображается 2 января 2012 года, а не 2 января, как должно было бы быть, если бы он настраивал мое событие из моего Телефон. С другой стороны, если я пытаюсь добавить событие вручную со своего телефона, это работает очень хорошо (я имею в виду, я могу добавить событие, которое происходит ежегодно).

Ответы [ 2 ]

5 голосов
/ 31 декабря 2011

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 до SDK 8 uri содержимого календаря имеет вид «content: // calendar / calendars», который отличается от SDks 8 и более поздних.
Между тем будьте осторожны с этими обычными ромами. поскольку API-интерфейс календаря в документации SDK не указан, некоторые поставщики и операторы могут изменять или даже удалять поставщик календаря, поэтому вам может потребоваться протестировать ваше приложение на множестве устройств.
Удачи!

0 голосов
/ 24 мая 2012
 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...