У меня возникла странная проблема в моем полном приложении календаря, начиная с Android N. Я хотел бы знать, если я что-то упустил или что-то не так с поставщиком календаря на Android N .Невозможно создать событие календаря в android N
Я использую поставщик содержимого календаря для управления календарем. Можно было открывать, редактировать, удалять и создавать события (от Android 2.1 до Marshmallow), но теперь N не позволяет создавать новые события. При попытке создания нового события событие отображается в списке событий и затем исчезает. При взгляде на бревнах, это то, что происходит на самом деле:
EventHandler::InsertEvent: Forbidden Entity[ id=2172 calendar_id=1 calendar_sync_id=-899202677 ]
com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden {
"errors": [
{
"reason": "forbidden",
"domain": "global",
"message": "Forbidden"
}],
"message": "Forbidden",
"code": 403
}
Все, что я могу найти с этим ошибка связана с вызовами Calendar API, а не с контент-провайдером (Я думаю, что внутренне использует API Календаря и что-то не удается из-за отсутствия аутентификации?). Но, я просмотрел документацию поставщика https://developer.android.com/guide/topics/providers/calendar-provider.html и не смог найти никаких требований к аутентификации.
Я искал изменения в текущем приложении календаря из AOSP, но я не смог найти ничего подходящего. Они работают как адаптер синхронизации, который дает возможность писать на некоторых специальных столбцах, которые я не использую, поэтому я не думаю, что это является причиной проблемы.
Я также думал об использовании API календаря, но это было бы нежелательно, так как не будет работать в автономном режиме и, как сама документация по API календаря, укажет: «Примечание: Цель этой быстрой старта - продемонстрировать использование API календаря в приложении для Android. Однако приложения для рабочего календаря сильно выиграют от использования провайдера содержимого календаря, который работает в автономном режиме, получает нажатие, это хорошо подходит для платформы ».
Я был долгое время работая над этим, не повезло, играя с библиотеками клиентов/сервисов Google play, пытаясь использовать вход в Google, разрешать манифест и несколько образцов, и, в конце концов, я не знаю, куда еще идти, и я был бы очень признателен, если любой из вас мог бы сообщить мне, что может быть Ронг или что ожидаемый путь при написании события календаря на Android N.
Спасибо большое
Вот код:
public Uri AddCalendarEntry(CalendarEventObject eventObject) {
ContentValues event = new ContentValues();
if (eventObject.getCalendar() != null) {
event.put(CalendarContract.Events.CALENDAR_ID, Integer.parseInt(eventObject.getCalendar().getId()));
} else {
Log.e (DEBUG_TAG,"calendar id not available ");
return null;
}
event.put(CalendarContract.Events.TITLE, eventObject.getSubject());
event.put(CalendarContract.Events.DESCRIPTION, eventObject.getDescription());
event.put(CalendarContract.Events.EVENT_LOCATION, eventObject.getLocation());
event.put(CalendarContract.Events.STATUS, CalendarContract.Events.STATUS_CONFIRMED);
event.put(CalendarContract.Events.HAS_ALARM, 1); // 0 for false, 1 for true
// All day events must use timezone UTC, others can use default
if (eventObject.isAllDay()) {
event.put(CalendarContract.Events.ALL_DAY, 1); // 1 for true
event.put(CalendarContract.Events.EVENT_TIMEZONE, Time.TIMEZONE_UTC);
} else {
event.put(CalendarContract.Events.ALL_DAY, 0); // 0 for false
event.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().toString());
}
// Recurrent events must use "duration", normal events should use "dtend"
event.put(CalendarContract.Events.DTSTART, eventObject.getStartDateTime());
String recurrence = eventObject.getRecurrence();
if (recurrence != null && !TextUtils.isEmpty(recurrence)) {
String duration = datesToDuration(eventObject.getStartDateTime(), eventObject.getEndDateTime());
event.put(CalendarContract.Events.DURATION, duration);
event.put(CalendarContract.Events.RRULE, recurrence);
} else {
event.put(CalendarContract.Events.DTEND, eventObject.getEndDateTime());
}
Uri eventsUri = CalendarContract.Events.CONTENT_URI;
Uri insertedUri = null;
try {
insertedUri = mainActivity.getContentResolver().insert(eventsUri, event);
} catch(Exception e) {
Log.e(DEBUG_TAG, "Error creating event " + e);
}
return insertedUri;
}
Здесь полный след:
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
at
com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
at com.google.android.syncadapters.calendar.CalendarRequestExecutor.executeInternal(CalendarRequestExecutor.java:146)
at com.google.android.syncadapters.calendar.CalendarRequestExecutor.execute(CalendarRequestExecutor.java:120)
at com.google.android.syncadapters.calendar.EventHandler.sendEntityToServer(EventHandler.java:485)
at com.google.android.syncadapters.calendar.CalendarSyncAdapterApiary.sendEntityToServer(CalendarSyncAdapterApiary.java:4084)
at com.google.android.syncadapters.calendar.CalendarSyncAdapterApiary.processLocalChanges(CalendarSyncAdapterApiary.java:4031)
at com.google.android.syncadapters.calendar.CalendarSyncAdapterApiary.processLocalChangesForHandler(CalendarSyncAdapterApiary.java:3970)
at com.google.android.syncadapters.calendar.CalendarSyncAdapterApiary.performUpsync(CalendarSyncAdapterApiary.java:791)
at com.google.android.syncadapters.calendar.CalendarSyncAdapterApiary.performSync(CalendarSyncAdapterApiary.java:691)
at com.google.android.syncadapters.calendar.CalendarSyncAdapterApiary.onPerformLoggedSync(CalendarSyncAdapterApiary.java:504)
at com.android.emailcommon.syncadapter.LoggingThreadedSyncAdapter.onPerformSync(LoggingThreadedSyncAdapter.java:50)
at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:272)