1# 日程管理 2 3<!--Kit: Calendar Kit--> 4<!--Subsystem: Applications--> 5<!--Owner: @qq_42718467--> 6<!--Designer: @huangxinwei--> 7<!--Tester: @z30055209--> 8<!--Adviser: @ge-yafang--> 9 10日程指特定的事件或者活动安排,日程管理即对这些事件、活动进行规划和控制,能更有效地利用相关资源、提高生产力和效率,使人们更好地管理时间和任务。 11 12Calendar Kit中的日程[Event](../reference/apis-calendar-kit/js-apis-calendarManager.md#event)归属于某个对应的日历账户[Calendar](../reference/apis-calendar-kit/js-apis-calendarManager.md#calendar),一个日历账户下可以有多个日程,一个日程只属于一个Calendar。 13 14获取到日历账户对象之后,即可对该账户下的日程进行管理,包括日程的创建、删除、修改、查询等操作。在创建、修改日程时,支持对日程的标题、开始时间、结束时间、日程类型、日程地点、日程提醒时间、日程重复规则等相关信息进行设置,以便进行更丰富更有效的日程管理。 15 16## 接口说明 17 18以下是日程管理的相关接口,更多详细接口及使用请参考[@ohos.calendarManager](../reference/apis-calendar-kit/js-apis-calendarManager.md)。 19 20| 接口名称 | 描述 | 21| ----------------------------------------- |------------------------------------------------| 22| getCalendarManager(context: Context): CalendarManager | 根据上下文获取CalendarManager对象,用于管理日历。 | 23| createCalendar(calendarAccount: CalendarAccount): Promise\<Calendar> | 根据日历账户信息,创建一个Calendar对象,使用Promise异步回调。 | 24| addEvent(event: Event): Promise\<number> | 创建日程,入参Event不填日程id,使用Promise异步回调。 | 25| editEvent(event: Event): Promise\<number> | 通过跳转到日程创建界面创建单个日程,入参Event不填日程id,使用Promise异步回调。 | 26| deleteEvent(id: number): Promise\<void> | 删除指定日程id的日程,使用Promise异步回调。 | 27| updateEvent(event: Event): Promise\<void> | 更新日程,使用Promise异步回调。 | 28| getEvents(eventFilter?: EventFilter, eventKey?: (keyof Event)[]): Promise\<Event[]> | 获取Calendar下符合查询条件的Event,使用Promise异步回调。 | 29 30## 开发步骤 31 321. 导入相关依赖。 33 34 ```ts 35 // entry/src/main/ets/entryability/EntryAbility.ets 36 import { abilityAccessCtrl, AbilityConstant, common, PermissionRequestResult, Permissions, UIAbility, Want } from '@kit.AbilityKit'; 37 import { BusinessError } from '@kit.BasicServicesKit'; 38 import { calendarManager } from '@kit.CalendarKit'; 39 import { window } from '@kit.ArkUI'; 40 ``` 41 422. 申请权限。使用Calendar Kit时,需要在module.json5中声明申请读写日历日程所需的权限:`ohos.permission.READ_CALENDAR`和`ohos.permission.WRITE_CALENDAR`。具体指导可见[声明权限](../security/AccessToken/declare-permissions.md)。 43 443. 根据上下文获取日程管理器对象calendarMgr,用于对日历账户进行相关管理操作。推荐在`EntryAbility.ets`文件中进行操作。 45 46 ```ts 47 // entry/src/main/ets/entryability/EntryAbility.ets 48 export let calendarMgr: calendarManager.CalendarManager | null = null; 49 50 export let mContext: common.UIAbilityContext | null = null; 51 52 export default class EntryAbility extends UIAbility { 53 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { 54 console.info("Ability onCreate"); 55 } 56 57 onDestroy(): void { 58 console.info("Ability onDestroy"); 59 } 60 61 onWindowStageCreate(windowStage: window.WindowStage): void { 62 // Main window is created, set main page for this ability 63 console.info("Ability onWindowStageCreate"); 64 windowStage.loadContent('pages/Index', (err, data) => { 65 if (err.code) { 66 console.error(`Failed to load the content. Code: ${err.code}, message: ${err.message}`); 67 return; 68 } 69 console.info(`Succeeded in loading the content. Data: ${JSON.stringify(data)}`); 70 }); 71 mContext = this.context; 72 const permissions: Permissions[] = ['ohos.permission.READ_CALENDAR', 'ohos.permission.WRITE_CALENDAR']; 73 let atManager = abilityAccessCtrl.createAtManager(); 74 atManager.requestPermissionsFromUser(mContext, permissions).then((result: PermissionRequestResult) => { 75 console.info(`get Permission success, result: ${JSON.stringify(result)}`); 76 calendarMgr = calendarManager.getCalendarManager(mContext); 77 }).catch((error: BusinessError) => { 78 console.error(`get Permission error, error. Code: ${error.code}, message: ${error.message}`); 79 }) 80 } 81 82 onWindowStageDestroy(): void { 83 // Main window is destroyed, release UI related resources 84 console.info("Ability onWindowStageDestroy"); 85 } 86 87 onForeground(): void { 88 // Ability has brought to foreground 89 console.info("Ability onForeground"); 90 } 91 92 onBackground(): void { 93 // Ability has back to background 94 console.info("Ability onBackground"); 95 } 96 } 97 ``` 98 994. 根据日历账户信息创建Calendar对象,用于进行日程管理。设置日历配置信息,可以根据需要打开日程提醒、设置日历账户颜色。 100 101 ```ts 102 // Index.ets 103 import { BusinessError } from '@kit.BasicServicesKit'; 104 import { calendarMgr } from '../entryability/EntryAbility'; 105 import { calendarManager } from '@kit.CalendarKit'; 106 107 let calendar: calendarManager.Calendar | undefined = undefined; 108 // 指定日历账户信息 109 const calendarAccount: calendarManager.CalendarAccount = { 110 name: 'MyCalendar', 111 type: calendarManager.CalendarType.LOCAL, 112 // 日历账户显示名称,该字段如果不填,创建的日历账户在界面显示为空字符串。 113 displayName: 'MyCalendar' 114 }; 115 // 日历配置信息 116 const config: calendarManager.CalendarConfig = { 117 // 打开日程提醒 118 enableReminder: true, 119 // 设置日历账户颜色 120 color: '#aabbcc' 121 }; 122 // 创建日历账户 123 calendarMgr?.createCalendar(calendarAccount).then((data: calendarManager.Calendar) => { 124 console.info(`Succeeded in creating calendar data->${JSON.stringify(data)}`); 125 calendar = data; 126 // 请确保日历账户创建成功后,再进行相关日程的管理 127 128 // 设置日历配置信息,打开日程提醒、设置日历账户颜色 129 calendar.setConfig(config).then(() => { 130 console.info(`Succeeded in setting config, data->${JSON.stringify(config)}`); 131 }).catch((err: BusinessError) => { 132 console.error(`Failed to set config. Code: ${err.code}, message: ${err.message}`); 133 }); 134 // ... 135 }).catch((error: BusinessError) => { 136 console.error(`Failed to create calendar. Code: ${error.code}, message: ${error.message}`); 137 }); 138 ``` 139 1405. 在当前日历账户下添加日历日程,注意入参中不需要填写日程id。 141 142 创建日程时,支持设置日程的标题、开始时间、结束时间、日程类型、日程地点、日程提醒时间、日程重复规则等相关信息。 143 144 日程创建成功后会返回一个日程id,作为日程的唯一标识,后续可按照日程id进行指定日程的更新或删除。 145 146 目前支持以下两种方式来创建日程。 147 148 方式一:可以在日历账户下通过`addEvent()`或`addEvents()`接口创建日程。其中可使用`addEvent()`接口创建单个日程,也可以使用`addEvents()`接口批量创建日程,此处以创建单个日程为例。 149 150 方式二:在获取到日历管理器对象后,可通过`editEvent()`接口创建单个日程。调用此接口创建日程时,会跳转到日程创建页面,在日程创建页面进行相关操作完成日程的创建, `editEvent()`不支持自定义周期性日程创建。 151 152 ```ts 153 // Index.ets 154 let eventId : number | undefined = undefined; 155 const date = new Date(); 156 const event: calendarManager.Event = { 157 // 日程标题 158 title: 'title', 159 // 日程类型,不推荐三方开发者使用calendarManager.EventType.IMPORTANT,重要日程类型不支持一键服务跳转功能及无法自定义提醒时间 160 type: calendarManager.EventType.NORMAL, 161 // 日程开始时间 162 startTime: date.getTime(), 163 // 日程结束时间 164 endTime: date.getTime() + 60 * 60 * 1000, 165 // 距开始时间提前10分钟提醒 166 reminderTime: [10], 167 // 日程重复规则,可选属性。如果日程为周期性日程需要填写该属性。 168 recurrenceRule: { 169 // 日程重复规则类型,支持按天、按周、按月、按年重复 170 recurrenceFrequency: calendarManager.RecurrenceFrequency.DAILY, 171 // 日程重复次数,该字段和expire属性只需要填写一个,如果两个都填写按照count属性计算。 172 count: 100, 173 // 重复日程间隔时间,与recurrenceFrequency相关,此示例表示日程每隔2天进行重复。 174 interval: 2, 175 // 日程过期时间,该字段和count属性只需要填写一个,如果两个都填写按照count属性计算。 176 expire: date.getTime() + 60 * 60 * 1000 * 3, 177 // 日程排除日期,将该日期从重复日程中排除掉 178 excludedDates: [date.getTime() + 60 * 60 * 1000 * 2] 179 }, 180 // 日程服务,可选字段,需要一键服务功能的日程,填写该属性。 181 service: { 182 // 服务类型,比如一键查看、一键入会、一键追剧等。 183 type: calendarManager.ServiceType.TRIP, 184 // 服务的uri。可以跳转到三方应用相应界面,格式为DeepLink。使用DeepLink方式需要在华为HAG云侧进行注册,注册提供的信息为应用包名、应用的服务类型。 185 // DeepLink包括scheme、host、path以及参数(不包含参数值) 186 uri: 'xxx://xxx.xxx.com/xxx', 187 // 服务辅助描述信息,可选字段 188 description: '一键服务' 189 } 190 191 }; 192 // 方式一 193 calendar.addEvent(event).then((data: number) => { 194 console.info(`Succeeded in adding event, id -> ${data}`); 195 eventId = data; 196 }).catch((err: BusinessError) => { 197 console.error(`Failed to addEvent. Code: ${err.code}, message: ${err.message}`); 198 }); 199 // 方式二 200 const eventInfo: calendarManager.Event = { 201 // 日程标题 202 title: 'title', 203 // 日程类型 204 type: calendarManager.EventType.NORMAL, 205 // 日程开始时间 206 startTime: date.getTime(), 207 // 日程结束时间 208 endTime: date.getTime() + 60 * 60 * 1000 209 }; 210 calendarMgr?.editEvent(eventInfo).then((id: number): void => { 211 console.info(`create Event id = ${id}`); 212 eventId = id; 213 }).catch((err: BusinessError) => { 214 console.error(`Failed to create Event. Code: ${err.code}, message: ${err.message}`); 215 }); 216 ``` 217 2186. 按照日程id进行指定日程的更新,更新日程相关信息。 219 220 ```ts 221 // Index.ets 222 const updateEvent: calendarManager.Event = { 223 title: 'updateTitle', 224 description: 'updateEventTest', 225 type: calendarManager.EventType.NORMAL, 226 id: eventId, 227 startTime: date.getTime(), 228 endTime: date.getTime() + 60 * 60 * 1000 229 }; 230 calendar.updateEvent(updateEvent).then(() => { 231 console.info(`Succeeded in updating event`); 232 }).catch((err: BusinessError) => { 233 console.error(`Failed to update event. Code: ${err.code}, message: ${err.message}`); 234 }); 235 ``` 236 2377. 查询当前日历账户下的所有日程。由于涉及数据隐私安全,进行了权限管控的应用无法获取其他创建的日程信息。根据不同的查询条件和查询字段,返回不同的查询结果。 238 239 当没有查询条件和查询字段时,可查询指定日历账户下的所有日程。 240 ```ts 241 calendar.getEvents().then((data: calendarManager.Event[]) => { 242 console.info(`Succeeded in getting events, data -> ${JSON.stringify(data)}`); 243 }).catch((err: BusinessError) => { 244 console.error(`Failed to get events. Code: ${err.code}, message: ${err.message}`); 245 }); 246 ``` 247 248 还支持根据日程id、日程开始和结束时间、日程标题等查询条件来查询日程。 249 ```ts 250 // 根据日程id查询 251 const filterId = calendarManager.EventFilter.filterById([eventId]); 252 calendar.getEvents(filterId).then((data: calendarManager.Event[]) => { 253 console.info(`Succeeded in getting events, data -> ${JSON.stringify(data)}`); 254 }).catch((err: BusinessError) => { 255 console.error(`Failed to get events. Code: ${err.code}, message: ${err.message}`); 256 }); 257 258 // 根据日程标题查询 259 const filterTitle = calendarManager.EventFilter.filterByTitle('update'); 260 calendar.getEvents(filterTitle).then((data: calendarManager.Event[]) => { 261 console.info(`Succeeded in getting events, data -> ${JSON.stringify(data)}`); 262 }).catch((err: BusinessError) => { 263 console.error(`Failed to get events. Code: ${err.code}, message: ${err.message}`); 264 }); 265 266 // 根据日程开始和结束时间查询 267 const filterTime = calendarManager.EventFilter.filterByTime(1686931200000, 1687017600000); 268 calendar.getEvents(filterTime).then((data: calendarManager.Event[]) => { 269 console.info(`Succeeded in getting events filter by time, data -> ${JSON.stringify(data)}`); 270 }).catch((err: BusinessError) => { 271 console.error(`Failed to filter by time. Code: ${err.code}, message: ${err.message}`); 272 }); 273 ``` 274 2758. 按照日程id进行指定日程的删除。可以通过`deleteEvent()`接口进行单个日程的删除,也可以通过`deleteEvents()`接口批量删除指定日程,此处以删除单个指定日程为例。 276 277 ```ts 278 // Index.ets 279 calendar.deleteEvent(eventId).then(() => { 280 console.info("Succeeded in deleting event"); 281 }).catch((err: BusinessError) => { 282 console.error(`Failed to delete event. Code: ${err.code}, message: ${err.message}`); 283 }); 284 ``` 285