Календарь Android: как написать адаптер синхронизации для календаря INSERT

В основном я хотел бы открыть следующий неотвеченный пост:

Я хотел бы воспользоваться API-интерфейсом Android Calendar для создания календаря и вставлять в него события. Созданный календарь не должен быть локальной копией. Он должен синхронизироваться с календарем Google (онлайн). В документации говорится Чтобы сделать это, я должен использовать адаптер синхронизации. Но как я могу написать такой адаптер синхронизации?

До сих пор я нашел две следующие должности, но не решение.

Я хочу использовать API Android Calendar для этого, а не API Google, чтобы пользователи могут работать в автономном режиме.

Ответы

Ответ 1

Похоже, Google перепутал CalendarContract в этом отношении. Документация не совсем понятна:

... вставка новых календарей должна выполняться как адаптер синхронизации.

Как это выражается, мне кажется, что есть тонкий шанс, что это может сработать. Но практически говоря (судя по вашим связанным другим вопросам SO) приложение, использующее CalendarContract, не может создавать синхронизированные календари.

Вы действительно не хотите преодолевать все проблемы с созданием собственного SyncAdapter. Я сделал это один раз для одного из моих приложений, потому что мне нужно надежное решение для синхронизации доступа к календарю на предварительных устройствах Ice Cream Sandwich (где CalendarContract еще не существует).

Это много работы. Это связано с взаимодействием с API веб-сервиса Календаря Google (при соблюдении ограничений доступа), сохраняя локальную копию данных и синхронизируя только различия. В конечном итоге ваш собственный SyncAdapter также дублирует данные уже существующего Google Calendar SyncAdapter.

Что вы можете сделать в качестве обходного пути, просто реализует необходимую функцию "создать календарь" непосредственно на онлайн-API Календаря Google. Это требует, чтобы ваше приложение запрашивало у пользователя авторизацию через android.permission.USE_CREDENTIALS.

AccountManager можно использовать для получения правильного токена авторизации для доступа к API календаря Google. Для метода getAuthToken требуется параметр типа токена аутентификации. Правильным для доступа к чтению/записи календаря является следующий строковый литерал: "Manage your calendars".

Есть две большие проблемы с этим обходным решением:

  • Вы не можете точно знать, использует ли календарь синхронизации календаря календарь Google. Это, к сожалению, черный ящик.

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

Вы можете опросить CalendarContract для этого. Пусть ваше приложение ждет и ищет изменения в фоновом потоке, пока не появится новый календарь. Тогда у вас есть свой локальный идентификатор и перейдите.

Ответ 2

Невозможно создать синхронизируемый календарь с учетной записью Google (Gmail) программным путем с помощью API Clanedar. SyncAdapter можно использовать для создания новой учетной записи, отличной от Gmail, и создавать новые календари, но они не синхронизируются с Календарем Google.

Подробнее здесь: fooobar.com/info/351179/...