【HarmonyOS】日程管理---在应用内对日历添加日程实现到点提醒

122 阅读2分钟

日程管理

应用向日历中添加日程,用于到点提醒。例如预约办理业务,在应用中添加、修改预约信息或取消预约同步到日历中作为日程提醒。

需要日历读写权限ohos.permission.READ_CALENDAR、ohos.permission.WRITE_CALENDAR

创建日历管理对象

必须在同意权限之后创建。根据上下文获取的日历管理对象创建日历,在日历上创建日程

const ctx = AppStorage.get('context') as Context // 在EntryAbility中保存的context,便于全局使用
const calendarMgr = calendarManager.getCalendarManager(ctx)

获取日历对象

每个日历对象创建的日程都是独自管理的,日历应用打开侧边栏在华为账号下存在默认的我的日历,通过getCalendar方法获取默认日历对象,也可以点击日历前面的勾选框统一关闭或打开日程

// 1、获取默认的日历对象
calendarMgr.getCalendar().then(res => {
    // res 默认的日历对象
    calendar = res
})

// 2、创建日历对象
const calendarAccount: calendarManager.CalendarAccount = {
  name: 'test',
  type: calendarManager.CalendarType.LOCAL,
  displayName : '咕咕咕' // 在日历应用侧边栏中新增一个咕咕咕日历
};

calendarMgr.createCalendar(calendarAccount).then(res => {
    // res 创建的新的日历对象
    calendar = res
})

通过日历对象管理日程

新增日程管理

// 新增
const event: calendarManager.Event = {
  type: calendarManager.EventType.NORMAL,  // 日程提醒类型
  title: '预约网点',  // 日程标题
  description: '个人非现金业务办理',  // 日程描述
  startTime: , // 日程开始时间(13位时间戳)
  endTime:   // 日程结束时间(13位时间戳)
};

calendar.addEvent(event).then(id => {
    // 日程id在修改和删除时使用
})

// 删除
calendar.deleteEvent(id)
calendar.deleteEvents([...ids]) // 批量删除

// 修改
// event: calendarManager.Event
event.id = id
event.title = '新标题'
calendar.updateEvent(event)

// 查询
// filterByTime:时间查询; filterById:id查询;filterByTitle:标题查询
const filter = calendarManager.EventFilter.filterByTime(startTime, endTime)
calendar.getEvents(filter).then(res => {
    // 根据开始时间和结束时间查询的所以符合条件的结果
})

完整代码

import { calendarManager } from '@kit.CalendarKit'

class CalendarManager {
  private calendar: calendarManager.Calendar | null = null

  private init() {
    return new Promise<calendarManager.Calendar>((resolve, reject) => {
      if (this.calendar) {
        resolve(this.calendar)
      } else {
        const ctx = AppStorage.get('context') as Context
        const calendarMgr = calendarManager.getCalendarManager(ctx)
        calendarMgr.getCalendar().then((data) => {
          this.calendar = data
          resolve(this.calendar)
        })
      }
    })
  }

  async addEvent(title: string, content: string, startDate: string, endDate: string) {
    const event: calendarManager.Event = {
      type: calendarManager.EventType.NORMAL,
      title: title,
      description: content,
      startTime: new Date(startDate).getTime(),
      endTime: new Date(endDate).getTime()
    };
    return this.init().then(data => data.addEvent(event))
  }

  getEvent(startDate: string, endDate: string) {
    const startTime = new Date(startDate).getTime()
    const endTime = new Date(endDate).getTime()
    const filter = calendarManager.EventFilter.filterByTime(startTime, endTime)
    return new Promise<number[]>((resolve, reject) => {
      this.init().then(data => {
        data.getEvents(filter).then(res => {
          const ids = res.map((item) => item.id!)
          resolve(ids)
        }).catch(reject)
      })
    })
  }

  delEvent(startDate: string, endDate: string) {
    return this.getEvent(startDate, endDate).then(res => this.calendar?.deleteEvent(res[0]))
  }
}

export default new CalendarManager()