Bonjour,
J'ai quelques soucis pour créer un calendrier lié à un compte Google et qui soit normalement synchronisé.
J'arrive à créer un calendrier lié au compte, mais seulement en local, ce qui m'ennuie pas mal !
Voici en gros le code que j'aimerais utiliser mais qui ne fonctionne pas :
accountName et accountType étant récupéré grâce à AccountManager :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public static Uri createCalendarWithName(Context ctx, String name,String accountName,String accountType) { Uri target = Uri.parse(CalendarContract.Calendars.CONTENT_URI.toString()); target = target.buildUpon().appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true") .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, accountName) .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, accountType).build(); ContentValues values = new ContentValues(); values.put(Calendars.ACCOUNT_NAME, accountName); values.put(Calendars.ACCOUNT_TYPE, "com.google"); values.put(Calendars.NAME, name); values.put(Calendars.CALENDAR_DISPLAY_NAME, name); values.put(Calendars.CALENDAR_COLOR, 0x00FF00); values.put(Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER); values.put(Calendars.OWNER_ACCOUNT, accountName); values.put(Calendars.VISIBLE, 1); values.put(Calendars.SYNC_EVENTS, 1); values.put(Calendars.CALENDAR_TIME_ZONE, "Europe/Rome"); Uri newCalendar = ctx.getContentResolver().insert(target, values); return newCalendar; }
Lorsque j’exécute le code, je n'ai aucune erreur, newCalendar est bien rempli et je peux récupérer l'id du calendrier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 AccountManager manager = AccountManager.get(context); Account[] accounts = manager.getAccountsByType("com.google");
Je peux aussi ajouter des événements dedans sans aucun soucis. Le problème, c'est que le calendrier (et du coup tout ce qu'il contient) est totalement invisible. C'est un peu comme si "je travaillais avec un calendrier que l'utilisateur n'a pas le droit de voir".
La seule solution que j'ai supprime la synchronisation supposé avec le compte.
Il faut pour cela que je change ACCOUNT_TYPE en TYPE_LOCAL (au lieu de "google.com" contenu dans la variable accountType) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Uri target = Uri.parse(CalendarContract.Calendars.CONTENT_URI.toString()); target = target.buildUpon().appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true") .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, accountName) .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, Calendars.ACCOUNT_TYPE_LOCAL).build();
En lisant la doc, on trouve :
Ce qui ressemble un peu à mon cas, mais pas totalement puisque le calendrier à l'air d'exister encore lorsque j'ajoute des événements.public static final String ACCOUNT_TYPE_LOCAL
Added in API level 14 A special account type for calendars not associated with any account. Normally calendars that do not match an account on the device will be removed. Setting the account_type on a calendar to this will prevent it from being wiped if it does not match an existing account.
See Also ACCOUNT_TYPE Constant Value: "LOCAL"
J'en viens donc à me poser la question, est ce que ce que je souhaite faire est réalisable ? Ou il n'est pas possible de faire ca ?
Je ne trouve rien dans la doc disant si c'est possible ou non. Pourtant ca me semble être un peu le petit plus de l'agenda google sur un agenda lambda...
Merci.
Partager