鸿蒙 Calendar Kit日程管理 (二)
本文介绍了基于CalendarKit的日程管理开发流程。主要内容包括:1)日程与日历账户的归属关系;2)日程创建、更新、查询和删除等核心接口的使用方法;3)日程重复规则和一键服务功能的配置说明。开发步骤涵盖权限申请、日历账户创建、日程操作等关键环节,并提供了注意事项,如IMPORTANT类型日程的限制和DeepLink注册要求。通过示例代码详细展示了如何实现完整的日程管理功能。

日程指特定的事件或者活动安排,日程管理即对这些事件、活动进行规划和控制。Calendar Kit中的日程Event归属于某个对应的日历账户Calendar,一个日历账户下可以有多个日程,一个日程只属于一个Calendar。
本文将详细介绍:
-
日程管理核心接口
-
开发步骤:权限申请、创建日程、更新日程、查询日程、删除日程
-
日程重复规则配置
-
一键服务功能
一、日程管理
1.1 日程与账户的关系
| 关系 | 说明 |
|---|---|
| 归属关系 | 日程归属于某个日历账户 |
| 一对多 | 一个日历账户下可以有多个日程 |
| 一对一 | 一个日程只属于一个Calendar |
1.2 日程支持的信息设置
在创建、修改日程时,支持对以下相关信息进行设置:
| 信息项 | 说明 |
|---|---|
| 标题 | 日程的标题 |
| 开始时间 | 日程开始时间 |
| 结束时间 | 日程结束时间 |
| 日程类型 | NORMAL、IMPORTANT等 |
| 日程地点 | 日程发生地点 |
| 日程提醒时间 | 提前多久提醒 |
| 日程重复规则 | 按天、按周、按月、按年重复 |
二、核心接口说明
| 接口 | 描述 |
|---|---|
getCalendarManager(context) |
根据上下文获取CalendarManager对象 |
createCalendar(calendarAccount) |
根据日历账户信息创建Calendar对象 |
addEvent(event) |
创建日程,入参Event不填日程id |
editEvent(event) |
通过跳转到日程创建界面创建单个日程 |
deleteEvent(id) |
删除指定日程id的日程 |
updateEvent(event) |
更新日程 |
getEvents(eventFilter, eventKey) |
获取Calendar下符合查询条件的Event |
三、开发步骤
3.1 导入相关依赖
import { abilityAccessCtrl, AbilityConstant, common, PermissionRequestResult, Permissions, UIAbility, Want } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { calendarManager } from '@kit.CalendarKit';
import { window } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';
3.2 申请权限
在module.json5中声明申请读写日历日程所需的权限:
{
"module": {
"requestPermissions": [
{ "name": "ohos.permission.READ_CALENDAR" },
{ "name": "ohos.permission.WRITE_CALENDAR" }
]
}
}
3.3 获取日历管理器
const DOMAIN = 0x0000;
export let calendarMgr: calendarManager.CalendarManager | null = null;
export let mContext: common.UIAbilityContext | null = null;
export default class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage: window.WindowStage): void {
windowStage.loadContent('pages/Index', (err, data) => { });
mContext = this.context;
const permissions: Permissions[] = ['ohos.permission.READ_CALENDAR', 'ohos.permission.WRITE_CALENDAR'];
let atManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(mContext, permissions).then(() => {
calendarMgr = calendarManager.getCalendarManager(mContext);
});
}
}
3.4 创建日历账户
let calendar: calendarManager.Calendar | undefined = undefined;
// 指定日历账户信息
const calendarAccount: calendarManager.CalendarAccount = {
name: 'MyCalendar',
type: calendarManager.CalendarType.LOCAL,
displayName: 'MyCalendar'
};
// 日历配置信息
const config: calendarManager.CalendarConfig = {
enableReminder: true, // 打开日程提醒
color: '#aabbcc' // 设置日历账户颜色
};
// 创建日历账户
calendarMgr?.createCalendar(calendarAccount).then((data: calendarManager.Calendar) => {
calendar = data;
calendar.setConfig(config);
}).catch((error: BusinessError) => {
hilog.error(DOMAIN, 'testTag', `Failed to create calendar: ${error.code}`);
});
3.5 添加日程
方式一:通过addEvent()创建单个日程
const date = new Date();
const event: calendarManager.Event = {
title: 'title', // 日程标题
type: calendarManager.EventType.NORMAL, // 日程类型
startTime: date.getTime(), // 开始时间
endTime: date.getTime() + 60 * 60 * 1000, // 结束时间(1小时后)
reminderTime: [10], // 提前10分钟提醒
// 重复规则(可选)
recurrenceRule: {
recurrenceFrequency: calendarManager.RecurrenceFrequency.DAILY, // 按天重复
count: 100, // 重复次数
interval: 2, // 每隔2天重复
expire: date.getTime() + 60 * 60 * 1000 * 3, // 过期时间
excludedDates: [date.getTime() + 60 * 60 * 1000 * 2] // 排除日期
},
// 一键服务(可选)
service: {
type: calendarManager.ServiceType.TRIP, // 服务类型
uri: 'xxx://xxx.xxx.com/xxx', // DeepLink
description: '一键服务'
}
};
calendar.addEvent(event).then((data: number) => {
hilog.info(DOMAIN, 'testTag', `Succeeded in adding event, id: ${data}`);
}).catch((err: BusinessError) => {
hilog.error(DOMAIN, 'testTag', `Failed to addEvent: ${err.code}`);
});
方式二:通过editEvent()跳转日程创建界面
const eventInfo: calendarManager.Event = {
title: 'title',
type: calendarManager.EventType.NORMAL,
startTime: date.getTime(),
endTime: date.getTime() + 60 * 60 * 1000
};
calendarMgr?.editEvent(eventInfo).then((id: number) => {
hilog.info(DOMAIN, 'testTag', `create Event id = ${id}`);
}).catch((err: BusinessError) => {
hilog.error(DOMAIN, 'testTag', `Failed to create Event: ${err.code}`);
});
注意:
-
不推荐使用
calendarManager.EventType.IMPORTANT,重要日程类型不支持一键服务跳转功能及无法自定义提醒时间 -
editEvent()不支持自定义周期性日程创建
3.6 更新日程
按照日程id进行指定日程的更新:
const updateEvent: calendarManager.Event = {
title: 'updateTitle',
description: 'updateEventTest',
type: calendarManager.EventType.NORMAL,
id: eventId, // 必须指定日程id
startTime: date.getTime(),
endTime: date.getTime() + 60 * 60 * 1000
};
calendar.updateEvent(updateEvent).then(() => {
hilog.info(DOMAIN, 'testTag', 'Succeeded in updating event');
}).catch((err: BusinessError) => {
hilog.error(DOMAIN, 'testTag', `Failed to update event: ${err.code}`);
});
3.7 查询日程
查询所有日程:
calendar.getEvents().then((data: calendarManager.Event[]) => {
hilog.info(DOMAIN, 'testTag', `Events: ${JSON.stringify(data)}`);
}).catch((err: BusinessError) => {
hilog.error(DOMAIN, 'testTag', `Failed to get events: ${err.code}`);
});
根据日程id查询:
const filterId = calendarManager.EventFilter.filterById([eventId]);
calendar.getEvents(filterId).then((data: calendarManager.Event[]) => {
hilog.info(DOMAIN, 'testTag', `Events by id: ${JSON.stringify(data)}`);
}).catch((err: BusinessError) => {
hilog.error(DOMAIN, 'testTag', `Failed to get events: ${err.code}`);
});
根据日程标题查询:
const filterTitle = calendarManager.EventFilter.filterByTitle('update');
calendar.getEvents(filterTitle).then((data: calendarManager.Event[]) => {
hilog.info(DOMAIN, 'testTag', `Events by title: ${JSON.stringify(data)}`);
}).catch((err: BusinessError) => {
hilog.error(DOMAIN, 'testTag', `Failed to get events: ${err.code}`);
});
根据日程开始和结束时间查询:
const filterTime = calendarManager.EventFilter.filterByTime(1686931200000, 1687017600000);
calendar.getEvents(filterTime).then((data: calendarManager.Event[]) => {
hilog.info(DOMAIN, 'testTag', `Events by time: ${JSON.stringify(data)}`);
}).catch((err: BusinessError) => {
hilog.error(DOMAIN, 'testTag', `Failed to filter by time: ${err.code}`);
});
3.8 删除日程
calendar.deleteEvent(eventId).then(() => {
hilog.info(DOMAIN, 'testTag', 'Succeeded in deleting event');
}).catch((err: BusinessError) => {
hilog.error(DOMAIN, 'testTag', `Failed to delete event: ${err.code}`);
});
四、日程重复规则
| 属性 | 类型 | 说明 |
|---|---|---|
recurrenceFrequency |
RecurrenceFrequency | 重复频率:DAILY(按天)、WEEKLY(按周)、MONTHLY(按月)、YEARLY(按年) |
count |
number | 重复次数(与expire二选一,都填则按count) |
interval |
number | 重复间隔时间,与recurrenceFrequency相关 |
expire |
number | 过期时间(与count二选一,都填则按count) |
excludedDates |
number[] | 排除日期,将该日期从重复日程中排除 |
五、一键服务功能
日程服务(service)字段用于需要一键服务功能的日程:
| 属性 | 类型 | 说明 |
|---|---|---|
type |
ServiceType | 服务类型,如一键查看、一键入会、一键追剧等 |
uri |
string | DeepLink,可以跳转到三方应用相应界面 |
description |
string | 服务辅助描述信息(可选) |
注意:使用DeepLink方式需要在华为HAG云侧进行注册,注册提供的信息为应用包名、应用的服务类型。
六、接口汇总
| 操作 | 接口 | 说明 |
|---|---|---|
| 创建日程 | addEvent(event) |
入参不填日程id |
| 创建日程 | editEvent(event) |
跳转到日程创建界面 |
| 更新日程 | updateEvent(event) |
需填写日程id |
| 删除日程 | deleteEvent(id) |
按日程id删除 |
| 查询所有 | getEvents() |
- |
| 按id查询 | getEvents(filterById) |
- |
| 按标题查询 | getEvents(filterByTitle) |
- |
| 按时间查询 | getEvents(filterByTime) |
- |
开发流程
导入依赖 + 申请权限
↓
获取日历管理器
↓
创建日历账户
↓
配置日历(打开提醒、设置颜色)
↓
创建日程(addEvent / editEvent)
↓
(可选)更新日程
↓
(可选)查询日程
↓
(可选)删除日程
注意事项
-
日程id:创建成功后返回,作为唯一标识,更新/删除时需要
-
IMPORTANT类型:不推荐使用,不支持一键服务跳转功能及无法自定义提醒时间
-
editEvent限制:不支持自定义周期性日程创建
-
权限管控:应用无法获取其他应用创建的日程信息
-
DeepLink注册:使用一键服务需要在华为HAG云侧注册
更多推荐




所有评论(0)