只读日历条目

问题描述 投票:1回答:1

我插入了这样的日历合约条目:

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);

这很好用,我可以输入日历条目等。但我现在需要将其设为只读,以便用户无法编辑日历条目。

我认为当我将CALENDAR_ACCESS_LEVEL设置为CAL_ACCESS_READ时,它应该足以使日历只读。

知道如何实现吗?顺便说一下,我正在使用Android O测试Pixel。

android calendar android-calendar
1个回答
2
投票

不要让用户成为组织者。添加事件时,默认管理器将是用户。要更改它,请在添加事件时将此行添加到ContentValues,并指定一个这样的管理器电子邮件地址

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

由于用户不是组织者,用户仍然可以删除事件但不能编辑事件内容,例如时间,标题,描述等。

那花了一些时间。最后我发现我必须更改CalendarContract.Events.ORGANIZER值的邮件地址,以防止我可以编辑日历条目。正如暗示其他人如何解决问题我尝试了很多愚蠢的事情,但后来我有想法检查它是如何在AOSP中完成的。所以我只是搜索“日历aosp代码”,发现代码在GitHub上镜像。在repo中使用代码搜索后,我找到了方法canModifyEvent(...)。现在它变得无视了:

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

确保客人无法编辑活动,也不要成为组织者。

快乐的编码!

© www.soinside.com 2019 - 2024. All rights reserved.