Синхронизировать изменения локального календаря в Oreo
Я хочу, чтобы пользователь выбрал локальный календарь (Google, Exchange и т. Д.), А затем извлек события и синхронизировал их с моим API. Я добавляю им дополнительную функциональность. Я пытался использовать CalendarContract
запросить все события:
private static final String[] EVENT_INSTANCES_PROJECTION = new String[]{
CalendarContract.Instances._ID,
CalendarContract.Instances.EVENT_ID,
CalendarContract.Instances.ORIGINAL_ID,
CalendarContract.Instances.TITLE,
CalendarContract.Instances.EVENT_LOCATION,
CalendarContract.Instances.BEGIN,
CalendarContract.Instances.END,
CalendarContract.Instances.OWNER_ACCOUNT,
CalendarContract.Instances.DESCRIPTION,
CalendarContract.Instances.STATUS,
CalendarContract.Instances.ALL_DAY,
};
private static final int INSTANCE_PROJECTION_ID_INDEX = 0;
private static final int INSTANCE_PROJECTION_EVENT_ID_INDEX = 1;
private static final int INSTANCE_PROJECTION_ORIGINAL_ID_INDEX = 2;
private static final int INSTANCE_PROJECTION_TITLE_INDEX = 3;
private static final int INSTANCE_PROJECTION_EVENT_LOCATION_INDEX = 4;
private static final int INSTANCE_PROJECTION_BEGIN_INDEX = 5;
private static final int INSTANCE_PROJECTION_END_INDEX = 6;
private static final int INSTANCE_PROJECTION_OWNER_ACCOUNT_INDEX = 7;
private static final int INSTANCE_PROJECTION_DESCRIPTION_INDEX = 8;
private static final int INSTANCE_PROJECTION_STATUS_INDEX = 9;
private static final int INSTANCE_PROJECTION_ALL_DAY_INDEX = 10;
public Cursor getEventInstancesCursor(Context context, long calendarId) {
ContentResolver cr = context.getContentResolver();
Uri.Builder builder = CalendarContract.Instances.CONTENT_URI.buildUpon();
ContentUris.appendId(builder, mSyncWindowStart.getTimeInMillis());
ContentUris.appendId(builder, mSyncWindowEnd.getTimeInMillis());
Uri uri = builder.build();
String selection = CalendarContract.Instances.CALENDAR_ID + " = ? AND " +
"(( " + CalendarContract.Events.DTSTART + " >= " + mSyncWindowStart.getTimeInMillis() + " ) AND ( " + CalendarContract.Events.DTSTART + " <= " + mSyncWindowEnd.getTimeInMillis() + " ))";
String[] selectionArgs = new String[]{String.valueOf(calendarId)};
return cr.query(uri, EVENT_INSTANCES_PROJECTION, selection, selectionArgs, null);
}
private void getEventInstances(Context context, Cursor cur, Map<String, String> internalEventIdToUId, String accountName, String accountEmail) {
// Use the cursor to step through the returned records
while (cur.moveToNext()) {
// Get the field values
long instanceId = cur.getLong(INSTANCE_PROJECTION_ID_INDEX);
String originalId = cur.getString(INSTANCE_PROJECTION_ORIGINAL_ID_INDEX);
String eventId = cur.getString(INSTANCE_PROJECTION_EVENT_ID_INDEX);
String title = cur.getString(INSTANCE_PROJECTION_TITLE_INDEX);
String location = cur.getString(INSTANCE_PROJECTION_EVENT_LOCATION_INDEX);
long startDate = cur.getLong(INSTANCE_PROJECTION_BEGIN_INDEX);
long endDate = cur.getLong(INSTANCE_PROJECTION_END_INDEX);
String ownerAccount = cur.getString(INSTANCE_PROJECTION_OWNER_ACCOUNT_INDEX);
String description = cur.getString(INSTANCE_PROJECTION_DESCRIPTION_INDEX);
int status = cur.getInt(INSTANCE_PROJECTION_STATUS_INDEX);
boolean isAllDayEvent = cur.getInt(INSTANCE_PROJECTION_ALL_DAY_INDEX) == 1;
}
}
Это отлично работает, я получаю все события.
Мне нужно обновить события, если новые события изменены, удалены или добавлены. До Android O я использовал BroadcastReceiver
и получил уведомление, когда было сделано изменение. Если DIRTY
поле было 1, событие было обновлено, и если событие было удалено DELETED
был установлен в 1.
Android O больше не поддерживает неявные намерения, поэтому это больше не работает. Как я могу определить изменения событий в Android O?