Android: как правильно использовать CalendarAlerts для отображения уникального сообщения в будильниках

Я создал несколько событий и сохранил данные в таблице sqlite, но не в системном календаре. Однако я хотел бы иметь оповещение/напоминание для этих событий, аналогичное другим событиям, хранящимся в системе.

Ссылаясь на приведенный ниже код, детали события помещаются в таблицу «CalendarAlerts», а в широковещательном приемнике используется alertCursor для поиска данных о событии с временем начала, близким к текущему времени.

Код хорошо работал, если событие хранилось в системе с «длинным» идентификатором события. Но когда я пытаюсь поместить данные моего события sqlite в «CalendarAlerts» с «строковым» идентификатором события. Он показывает, что данные успешно вставлены в таблицу, но я бы не стал запрашивать результат в классе «Получатель предупреждений».

Некоторое время искал в Google, и кажется, что не так много людей говорят на тему «CalendarAlerts». Хорошо, если кто-нибудь поделится опытом в этом вопросе.

Настройка менеджера тревог

Uri alertUri = CalendarAlerts.CONTENT_URI;
long alarmMillis = (long) mStart - (long)(min*60*1000);

ContentValues alertValues =AlertUtils.makeContentValues(eventIdentifier,mStart, mEnd,alarmMillis, 0);
context.getContentResolver().insert(alertUri, alertValues);

public static ContentValues makeContentValues(String eventId, long begin, long end,
        long alarmTime, int minutes) {
    ContentValues values = new ContentValues();
    values.put(CalendarAlerts.EVENT_ID, eventId);
    values.put(CalendarAlerts.BEGIN, begin);
    values.put(CalendarAlerts.END, end);
    values.put(CalendarAlerts.ALARM_TIME, alarmTime);
    long currentTime = System.currentTimeMillis();
    values.put(CalendarAlerts.CREATION_TIME, currentTime);
    values.put(CalendarAlerts.RECEIVED_TIME, 0);
    values.put(CalendarAlerts.NOTIFY_TIME, 0);
    values.put(CalendarAlerts.STATE, CalendarAlerts.STATE_SCHEDULED);
    values.put(CalendarAlerts.MINUTES, minutes);
    return values;
}

AlertReceiver.java

Cursor alertCursor = cr.query(CalendarAlerts.CONTENT_URI, ALERT_PROJECTION,
            (ACTIVE_ALERTS_SELECTION + currentMillis), ACTIVE_ALERTS_SELECTION_ARGS,
            ACTIVE_ALERTS_SORT);

person Antoine Murion    schedule 02.03.2016    source источник


Ответы (1)


Вы можете использовать этот код, который работает для меня:

ContentResolver cr = getActivity().getContentResolver();
ContentValues values = new ContentValues();

values.put(CalendarContract.Events.DTSTART, startMillis);
values.put(CalendarContract.Events.TITLE, title);
values.put(CalendarContract.Events.DESCRIPTION, "description");

TimeZone timeZone = TimeZone.getDefault();
values.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone.getID());

// default calendar
values.put(CalendarContract.Events.CALENDAR_ID, 1);

//for one hour
values.put(CalendarContract.Events.DURATION, "+P1H");
values.put(CalendarContract.Events.HAS_ALARM, 1);

// cr.delete(CalendarContract.Events.CONTENT_URI, null,null);
// insert event to calendar
Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, values);
person Rathod Vijay    schedule 02.03.2016
comment
Итак, вы на самом деле поместили событие sqlite в систему, чтобы оно заработало? Но как бы вы определили событие, не получив идентификатор события? - person Antoine Murion; 02.03.2016
comment
не идентифицируйте событие без получения идентификатора события, идентификатор события уникален, да работает для события sqlite на устройстве - person Rathod Vijay; 02.03.2016