proveedor - Calendario de Android: cómo escribir el adaptador de sincronización para el calendario INSERTAR
proveedor de calendario android (2)
Básicamente, me gustaría volver a abrir la siguiente publicación sin respuesta:
Me gustaría hacer uso de la API del proveedor de calendario de Android para crear un calendario e insertar eventos en él. El calendario que se crea no debe ser una copia local. Debe sincronizarse con el calendario de Google (en línea). La documentación dice que para hacer esto debo usar un adaptador de sincronización. ¿Pero cómo escribo tal adaptador de sincronización?
Hasta ahora he encontrado las dos siguientes publicaciones pero no hay solución.
- Crear nuevo calendario sincronizado con la API de Android
- ¿Cómo puedo agregar un nuevo calendario de teléfono a Android?
Quiero usar la API del calendario de Android para esto y no la API de Google para que los usuarios puedan trabajar sin conexión.
No es posible crear un calendario sincronizable con la cuenta de Google (Gmail) mediante programación utilizando la API de Clanedar por ahora. SyncAdapter se puede usar para crear una nueva cuenta que no sea de Gmail y crear nuevos calendarios allí, pero estos no se pueden sincronizar con Google Calendar.
Más detalles aquí: https://.com/a/19734278/237232
Parece que Google arruinó CalendarContract en este sentido. La documentación no es completamente clara al respecto:
... la inserción de nuevos calendarios debe hacerse como un adaptador de sincronización.
La forma en que se expresa esto me parece que existe una pequeña posibilidad de que funcione. Pero prácticamente hablando (a juzgar por sus otras preguntas de SO vinculadas) una aplicación que usa CalendarContract no puede crear calendarios sincronizados.
Realmente no desea pasar por todos los problemas de crear su propio SyncAdapter. Lo hice una vez para una de mis aplicaciones porque quería una solución confiable para tener acceso sincronizado al calendario en los dispositivos anteriores a Ice Cream Sandwich (donde CalendarContract aún no existe).
Eso es mucho trabajo. Implica interactuar con la API del servicio web de Google Calendar (respetando sus limitaciones de acceso), manteniendo una copia local de los datos y sincronizando solo las diferencias. En última instancia, su propio SyncAdapter también duplicará los datos del ya existente Google Calendar SyncAdapter.
Lo que podría hacer como solución es implementar la función necesaria "crear calendario" directamente en la API en línea de Google Calendar . Requiere que su aplicación solicite autorización al usuario a través de android.permission.USE_CREDENTIALS
.
AccountManager se puede utilizar para obtener el token de autorización correcto para acceder a la API de Google Calendar. El método getAuthToken
requiere un parámetro de tipo de token de autenticación. El correcto para el acceso de lectura / escritura del calendario es la siguiente cadena literal: "Manage your calendars"
.
Sin embargo, hay dos grandes problemas con esa solución:
No puede estar seguro de si el servidor de sincronización del calendario utiliza Google Calendar. Desafortunadamente es una caja negra.
No puede estar seguro de cuándo el adaptador de sincronización del calendario se pondrá al día con estos cambios. Supongo que es posible forzar una nueva sincronización de alguna manera. Pero incluso entonces, tu aplicación se detendrá. No puedes simplemente operar basado en ese nuevo calendario y usarlo de inmediato. Su aplicación debe esperar hasta que se produzca la sincronización.
Usted podría sondear CalendarContract para eso. Deje que su aplicación espere y busque cambios en un hilo de fondo hasta que aparezca el nuevo calendario. Entonces tienes tu id local y sigues adelante.