Добавить события календаря из JSON Android

Я получаю ответ в формате json, в котором указан диапазон дат ex 2018-07-11 as start date and 2018-07-31 as end date. Вот полный ответ json:

{
     "program_details": [
         {
             "batch_name": "batch testing",
             "batch_id": "41",
             "prg_name": "t4",
             "prg_id": "180",
             "prg_user_map_id": "175",
             "prg_start_date": "2018-04-15",
             "prg_end_date": "2018-04-21"
         },
        ]
}

У меня есть виджет представления календаря по умолчанию из студии android в моем xml, и я пытаюсь показать этот диапазон дат от строки до даты и вставлен в календарь, но я не могу найти правильные методы для продолжения этого.

Я видел google calendar api, но не знаю, как решить эту проблему. Любая помощь или ссылки будут полезны. Спасибо.

1
0
749
1

Ответы 1

Календарь Google очень хитрый

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

public static long addEventToGoogleCalendar(Context context, HashMap<String, String> calendarAccauntsMap) {
    String eventUriString = "content://com.android.calendar/events";
    String reminderUriString = "content://com.android.calendar/reminders";

    ContentValues contentValues = new ContentValues();

    for(String key : calendarAccauntsMap.keySet()){
        if (key.equals(YOUR_USER_CALENDAR_EMAIL)){
            contentValues.put(CalendarContract.Events.CALENDAR_ID, Integer.parseInt(key));
        }
    }

    contentValues.put(CalendarContract.Events.TITLE, YOUR_EVENT_NAME); //batch_name

    contentValues.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());
    contentValues.put(CalendarContract.Events.DTSTART, YOUR_DATE_START_IN_MS); //prg_start_date in ms
    contentValues.put(CalendarContract.Events.DTEND, YOUR_DATE_END_IN_MS); //prg_end_date in ms
    contentValues.put(CalendarContract.Events.ALL_DAY, 0); 
    contentValues.put(CalendarContract.Events.STATUS, CalendarContract.Events.STATUS_CONFIRMED);

    Uri eventUri = context.getContentResolver().insert(Uri.parse(eventUriString), contentValues);
    long eventID = Long.parseLong(eventUri.getLastPathSegment());

    ContentValues reminderValues = new ContentValues();

    reminderValues.put(CalendarContract.Reminders.EVENT_ID, eventID);

    reminderValues.put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT); // Alert Methods: Default(0),

    context.getContentResolver().insert(Uri.parse(reminderUriString), reminderValues);

    return eventID;
}

Где calendarAccauntsMap - это карта идентификаторов пользователей, которую можно найти так:

public static HashMap<String, String> getCalendarAccounts(Context context) {
        String projection[] = {"_id", "calendar_displayName"};
        Cursor managedCursor = context.getContentResolver()
                .query(Uri.parse("content://com.android.calendar/calendars"), projection, null, null, null);

        HashMap<String, String> calendarMap = new HashMap<>();
        if (managedCursor != null) {
            if (managedCursor.moveToFirst()) {
                String calName;
                String calID;
                int nameCol = managedCursor.getColumnIndex(projection[1]);
                int idCol = managedCursor.getColumnIndex(projection[0]);
                do {
                    calName = managedCursor.getString(nameCol);
                    calID = managedCursor.getString(idCol);
                    if (calName.matches(emailRegex)) {
                        calendarMap.put(calID, calName);
                    }
                } while (managedCursor.moveToNext());
                managedCursor.close();
            }
        }
        return calendarMap;
    }

Элегантный код, но у меня есть некоторые сомнения, например, нужно ли мне использовать RxJava для наблюдаемой части и как он устанавливает диапазон дат из json? Если вы можете пояснить свой код, я приму этот ответ. Большое спасибо.

Andromeda 10.07.2018 13:54

См. Комментарии в моем коде. Также нет причин использовать RX. Я перепишу через несколько минут

Anton A. 10.07.2018 13:58

Хорошо, пожалуйста. Спасибо

Andromeda 10.07.2018 13:59

@Andromeda проверь еще раз

Anton A. 10.07.2018 14:04

Ваш код кажется работоспособным, но проблема в том, что у меня нет user_calendar_email, и каким должен быть объект при вызове метода addEventtoGoogleCalendar (this, Object, map)?

Andromeda 10.07.2018 14:58

Может ли это работать без входа пользователей в систему? Спасибо

Andromeda 10.07.2018 14:58

Я удалил событие Object, оно не используется. О пользователе. Вы можете удалить calName.matches(emailRegex), чтобы получить все календари устройства, а не только календарь пользователя. Я не помню, старый проект, но если вы отлаживаете, вы увидите, какие идентификаторы у вас там есть. Я думаю, должен быть какой-то идентификатор по умолчанию.

Anton A. 10.07.2018 15:07

Требуется ли для этого просмотр календаря в xml? Если возможно, вы можете поделиться github gist с этой рабочей реализацией? Спасибо, сэр

Andromeda 10.07.2018 15:11

@Andromeda Я не знаком с Gists. Этот код добавляет событие в системный календарь вашего устройства.

Anton A. 10.07.2018 15:13

Я хочу, чтобы этот календарь был эксклюзивным для приложения, если это невозможно, спасибо, сэр, за ваше время.

Andromeda 10.07.2018 15:18

@ Антон А., мне нужна помощь, братан

atozcodes 20.04.2021 14:44

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