0

У меня возникла странная проблема в моем полном приложении календаря, начиная с 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) 

ответ

0

Я отправляю эту информацию, а не реальное решение, но мои выводы, если я могу помочь кому-то, находящемуся в той же ситуации.

По-видимому, Google забыла предоставить разрешение календаря в некоторых сценариях. Таким образом, я думаю, что поддержка календаря была удалена случайно в:

Старые приложения (с целью ниже 23, Android M)

И

Новые устройства (с помощью Android N, 24 и выше)

Согласно документации, если вы настроите таргетинг ниже 23, вам не нужно беспокоиться о разрешениях времени выполнения, но, похоже, использование API календаря имеет некоторые требования, которые не были решены должным образом. После (сложной) миграции в моем приложении в Android Studio и ориентации на новые API, 23-24, мой календарь может, наконец, сохранить события.