Синхронизировать изменения локального календаря в 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?

0 ответов

Другие вопросы по тегам