Добавление события с напоминаниями в календарь с помощью способа «Intent.putExtra()»

Я пытаюсь добавить события в календарь с помощью следующего кода:

public Intent calPopulation()
{
        Intent calIntent = new Intent(Intent.ACTION_INSERT);
        calIntent.setType("vnd.android.cursor.item/event");
        calIntent.putExtra(CalendarContract.Events.TITLE, this._title);

        GregorianCalendar calDate = new GregorianCalendar(this._year,this._month, this._day, this._hour, this._minute);
        calIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, calDate.getTimeInMillis());
        calIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, calDate.getTimeInMillis()+60*60*1000);
        calIntent.putExtra(CalendarContract.Events.HAS_ALARM, true);
        calIntent.putExtra(CalendarContract.Reminders.EVENT_ID, CalendarContract.Events._ID);
        calIntent.putExtra(CalendarContract.Events.ALLOWED_REMINDERS, "METHOD_DEFAULT");
        calIntent.putExtra(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT);

        calIntent.putExtra(CalendarContract.Reminders.MINUTES,5);
        return calIntent;
}

А затем запустите действие с помощью: startActivity(mTask.calPopulation());

У меня нет никаких проблем, событие приложения календаря запускается с правильной информацией, которую я ввел в свое приложение, за исключением того, что оно не заполняет событие напоминанием, которое я хотел бы добавить.

У вас есть подсказки? Я пытался искать во многих потоках, используя этот метод (я имею в виду намерение.putExtra), но так и не нашел ничего интересного.

Другой вопрос, есть ли способ напрямую сохранить событие + напоминание в календаре, не открывая приложение календаря и не запрашивая действия пользователя?

Заранее спасибо. Алекс.


person Alexandre    schedule 22.02.2015    source источник
comment
что именно ты хочешь?   -  person Apurva    schedule 22.02.2015
comment
Привет, моя цель - установить напоминания одновременно с добавлением события в календарь. В моем примере напоминание не существует в календаре после запуска действия.   -  person Alexandre    schedule 23.02.2015
comment
Вам удалось сделать это правильно? Все еще используя Intent и не добавляя его напрямую?   -  person Zapnologica    schedule 22.06.2016


Ответы (2)


Нет ответа по указанному мной методу, но я нашел другой способ добавить событие с напоминаниями в календарь.

Нижеприведенные методы работают нормально для меня:

// Add an event to the calendar of the user.
    public void addEvent(Context context) {
        GregorianCalendar calDate = new GregorianCalendar(this._year, this._month, this._day, this._hour, this._minute);

        try {
            ContentResolver cr = context.getContentResolver();
            ContentValues values = new ContentValues();
            values.put(CalendarContract.Events.DTSTART, calDate.getTimeInMillis());
            values.put(CalendarContract.Events.DTEND, calDate.getTimeInMillis()+60*60*1000);
            values.put(CalendarContract.Events.TITLE, this._title);
            values.put(CalendarContract.Events.CALENDAR_ID, 1);
            values.put(CalendarContract.Events.EVENT_TIMEZONE, Calendar.getInstance()
                    .getTimeZone().getID());
            System.out.println(Calendar.getInstance().getTimeZone().getID());
            Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, values);

            // Save the eventId into the Task object for possible future delete.
            this._eventId = Long.parseLong(uri.getLastPathSegment());
            // Add a 5 minute, 1 hour and 1 day reminders (3 reminders)
            setReminder(cr, this._eventId, 5);
            setReminder(cr, this._eventId, 60);
            setReminder(cr, this._eventId, 1440);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // routine to add reminders with the event
    public void setReminder(ContentResolver cr, long eventID, int timeBefore) {
        try {
            ContentValues values = new ContentValues();
            values.put(CalendarContract.Reminders.MINUTES, timeBefore);
            values.put(CalendarContract.Reminders.EVENT_ID, eventID);
            values.put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT);
            Uri uri = cr.insert(CalendarContract.Reminders.CONTENT_URI, values);
            Cursor c = CalendarContract.Reminders.query(cr, eventID,
                    new String[]{CalendarContract.Reminders.MINUTES});
            if (c.moveToFirst()) {
                System.out.println("calendar"
                        + c.getInt(c.getColumnIndex(CalendarContract.Reminders.MINUTES)));
            }
            c.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // function to remove an event from the calendar using the eventId stored within the Task object.
    public void removeEvent(Context context) {
        ContentResolver cr = context.getContentResolver();

        int iNumRowsDeleted = 0;

        Uri eventsUri = Uri.parse(CALENDAR_URI_BASE+"events");
        Uri eventUri = ContentUris.withAppendedId(eventsUri, this._eventId);
        iNumRowsDeleted = cr.delete(eventUri, null, null);

        Log.i(DEBUG_TAG, "Deleted " + iNumRowsDeleted + " calendar entry.");
    }


    public int updateEvent(Context context) {
        int iNumRowsUpdated = 0;
        GregorianCalendar calDate = new GregorianCalendar(this._year, this._month, this._day, this._hour, this._minute);

        ContentValues event = new ContentValues();

        event.put(CalendarContract.Events.TITLE, this._title);
        event.put("hasAlarm", 1); // 0 for false, 1 for true
        event.put(CalendarContract.Events.DTSTART, calDate.getTimeInMillis());
        event.put(CalendarContract.Events.DTEND, calDate.getTimeInMillis()+60*60*1000);

        Uri eventsUri = Uri.parse(CALENDAR_URI_BASE+"events");
        Uri eventUri = ContentUris.withAppendedId(eventsUri, this._eventId);

        iNumRowsUpdated = context.getContentResolver().update(eventUri, event, null,
                null);

        // TODO put text into strings.xml
        Log.i(DEBUG_TAG, "Updated " + iNumRowsUpdated + " calendar entry.");

        return iNumRowsUpdated;
    }

Надеюсь, это может помочь другим, которые столкнулись с той же проблемой, что и я :).

Алекс.

person Alexandre    schedule 02.03.2015
comment
Этот метод добавляет событие непосредственно в календарь, поэтому требуются права на чтение/запись календаря. Для нас, которые предпочитают использовать намерение для отправки информации о событии в приложение календаря, есть ли способ предварительно заполнить данные напоминания на экране создания события? - person Singed; 05.10.2015
comment
Я напрямую создал событие календаря через свое приложение, а также добавил напоминание. Они работают отлично. Но когда я нажимаю уведомление о напоминании, открывается событие календаря устройства. Теперь я хочу настроить напоминание для загрузки моего приложения без загрузки календаря по умолчанию. Могу ли я достичь этого? - person Nooruddin Lakhani; 27.04.2016
comment
@Alexandre Что такое CALENDAR_URI_BASE в методах removeEvent и updateEvent? - person Newbie; 18.07.2016
comment
Uri uri = cr.insert(CalendarContract.Reminders.CONTENT_URI, значения); Выдает SqliteException на M - person Amardeep Kumar; 16.10.2016
comment
@Amardeep, вы нашли решение для SqliteException? - person Suraj Pohwani; 17.11.2016
comment
@SurajPohwani Сначала нам нужно найти основной календарь, а не использовать 1 в качестве CALENDAR_ID. Проверьте stackoverflow.com/questions/40073427/ - person Amardeep Kumar; 13.02.2017
comment
вы не используете намерения, вам нужно разрешение на запись для этого - person user924; 09.04.2020
comment
@Singed, ты нашел решение, используя намерение? - person user924; 09.04.2020
comment
@ user924 нет, извините, это было 5 лет назад, я даже не помню - person Singed; 10.04.2020

Согласен с приведенным выше ответом, но важен идентификатор календаря. вы не можете использовать 1, так как телефон Samsung использует 1 для своего календаря (S Planner). Таким образом, идентификатор календаря — это идентификатор, для которого вы хотите событие. Вы можете получить идентификатор календаря, следуя коду для определенного события

int calenderId=-1;
        String calenderEmaillAddress="[email protected]";
        String[] projection = new String[]{
                CalendarContract.Calendars._ID,
                CalendarContract.Calendars.ACCOUNT_NAME};
        ContentResolver cr = activity.getContentResolver();
        Cursor cursor = cr.query(Uri.parse("content://com.android.calendar/calendars"), projection,
                CalendarContract.Calendars.ACCOUNT_NAME + "=? and (" +
                        CalendarContract.Calendars.NAME + "=? or " +
                        CalendarContract.Calendars.CALENDAR_DISPLAY_NAME + "=?)",
                new String[]{calenderEmaillAddress, calenderEmaillAddress,
                        calenderEmaillAddress}, null);

        if (cursor.moveToFirst()) {

            if (cursor.getString(1).equals(calenderEmaillAddress))
                 calenderId=cursor.getInt(0); //youre calender id to be insered in above  answer


        }
person Rajesh Nasit    schedule 02.06.2017