Я получаю ответ в формате 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, но не знаю, как решить эту проблему. Любая помощь или ссылки будут полезны. Спасибо.
Календарь 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;
}
См. Комментарии в моем коде. Также нет причин использовать RX. Я перепишу через несколько минут
Хорошо, пожалуйста. Спасибо
@Andromeda проверь еще раз
Ваш код кажется работоспособным, но проблема в том, что у меня нет user_calendar_email, и каким должен быть объект при вызове метода addEventtoGoogleCalendar (this, Object, map)?
Может ли это работать без входа пользователей в систему? Спасибо
Я удалил событие Object, оно не используется. О пользователе. Вы можете удалить calName.matches(emailRegex), чтобы получить все календари устройства, а не только календарь пользователя. Я не помню, старый проект, но если вы отлаживаете, вы увидите, какие идентификаторы у вас там есть. Я думаю, должен быть какой-то идентификатор по умолчанию.
Требуется ли для этого просмотр календаря в xml? Если возможно, вы можете поделиться github gist с этой рабочей реализацией? Спасибо, сэр
@Andromeda Я не знаком с Gists. Этот код добавляет событие в системный календарь вашего устройства.
Я хочу, чтобы этот календарь был эксклюзивным для приложения, если это невозможно, спасибо, сэр, за ваше время.
@ Антон А., мне нужна помощь, братан
Элегантный код, но у меня есть некоторые сомнения, например, нужно ли мне использовать RxJava для наблюдаемой части и как он устанавливает диапазон дат из json? Если вы можете пояснить свой код, я приму этот ответ. Большое спасибо.