2017-07-21 6 views
1

J'inséré une entrée de contrat de calendrier comme celui-ci:Faire une entrée de calendrier en lecture seule

ContentValues values = new ContentValues(); 
values.put(CalendarContract.Calendars.ACCOUNT_NAME, account.name); 
values.put(CalendarContract.Calendars.ACCOUNT_TYPE, account.type); 
values.put(CalendarContract.Calendars.NAME, name); 
values.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, getDisplayName(account)); 
values.put(CalendarContract.Calendars.CALENDAR_COLOR, 0xffff0000); 
values.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_READ); 
values.put(CalendarContract.Calendars.OWNER_ACCOUNT, getMailAddressOf(account)); 
values.put(CalendarContract.Calendars.CALENDAR_TIME_ZONE, TimeZone.getTimeZone("GMT").getDisplayName()); 
values.put(CalendarContract.Calendars.SYNC_EVENTS, 1); 
Uri.Builder builder = CalendarContract.Calendars.CONTENT_URI.buildUpon(); 
builder.appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, account.name); 
builder.appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, account.type); 
builder.appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true"); 
Uri result = getContext().getContentResolver().insert(builder.build(), values); 

Cela fonctionne très bien, je peux entrer dans les entrées de calandre, etc. Mais je dois le faire maintenant en lecture seule afin que l'utilisateur ne peut pas modifier la entrée de calendrier.

Je pensais que lorsque je définirais CALENDAR_ACCESS_LEVEL à CAL_ACCESS_READ il devrait suffire de faire le calendrier en lecture seule.

Une idée de comment y parvenir? En passant, je suis en train de tester sur un pixel avec Android O.

Répondre

2

Ne pas faire l'utilisateur à l'organisateur. Lors de l'ajout de l'événement, l'organisateur par défaut sera l'utilisateur. Pour le modifier, ajouter cette ligne aux contentValues ​​lors de l'ajout de l'événement, attribuer une adresse e-mail de l'organisateur comme celui-ci

values.put(CalendarContract.Events.ORGANIZER,"[email protected]"; 

Puisque l'utilisateur n'est pas l'organisateur, l'utilisateur peut toujours supprimer l'événement, mais pas en mesure de modifier le contenu de l'événement comme l'heure, le titre, la description, etc.

Eh bien, cela a pris du temps. À la fin, j'ai découvert que je dois changer l'adresse e-mail de la valeur CalendarContract.Events.ORGANIZER pour empêcher que je puisse modifier l'entrée de calendrier. Juste comme un indice pour les autres comment j'ai glissé le problème, j'ai essayé beaucoup de choses stupides, mais j'ai eu l'idée de vérifier comment cela se fait dans AOSP. Donc, je viens de chercher "code calendrier aosp" et trouvé le code mirrowed sur GitHub. Après avoir utilisé la recherche de code dans le repo, j'ai trouvé la méthode canModifyEvent(...). Maintenant, il est devenu inconscient:

public static boolean canModifyEvent(CalendarEventModel model) { 
    return canModifyCalendar(model) 
      && (model.mIsOrganizer || model.mGuestsCanModify); 
} 

Assurez-vous que l'événement ne peut pas être modifié par les invités et ne pas être l'organisateur.

Bonne codification!