HarmonyOS ohos.calendarManager \(日程管理能力\) 的疑惑?

我使用一个单例创建了一个日程管理类,我使用this.calendarMgr?.createCalendar(this.calendarAccount);这种方式创建了一个Calendar ,并且往里面添加了一个event,后续我用this.calendar.getEvents()获取event时获取的数量却是0,导致无法修改和删除event,下面是我的单例代码

import { common } from '@kit.AbilityKit';
import { calendarManager } from '@kit.CalendarKit'
import { BusinessError } from '@kit.BasicServicesKit';
import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import {permissionUtils} from '@sinochemit/permissions'
import { promptAction } from '@kit.ArkUI';
import { CalendarDataManager } from 'cache';

export class CalendarManager {
  private static instance: CalendarManager;
  private permissions: Permissions = 'ohos.permission.WRITE_CALENDAR';

  private calendarMgr: calendarManager.CalendarManager | null = null;
  private calendar : calendarManager.Calendar | undefined = undefined;
  private config: calendarManager.CalendarConfig = {
    enableReminder: true,
    color: '#003AA4'
  };
  private context: Context = getContext(this) as common.UIAbilityContext;
  private calendarAccount: calendarManager.CalendarAccount = {
    name: 'EasyCalendarAccount',
    type: calendarManager.CalendarType.LOCAL,
    displayName : '***'
  };

  private constructor() {

  }
  public static getInstance(): CalendarManager {
    if (!CalendarManager.instance) {
      CalendarManager.instance = new CalendarManager();
      CalendarManager.instance.calendarMgr = calendarManager.getCalendarManager(CalendarManager.instance.context);
    }
    return CalendarManager.instance;
  }
  // 申请权限
  reqPermissionsAndRecord(permissions:Permissions): void {
    let atManager = abilityAccessCtrl.createAtManager();
    // requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
    atManager.requestPermissionsFromUser(this.context, [permissions]).then((data) => {
      let grantStatus: Array<number> = data.authResults;
      let length: number = grantStatus.length;
      for (let i = 0; i < length; i++) {
        if (grantStatus[i] === 0) {
          // 用户授权,可以继续访问目标操作
          console.info('授权成功')
        } else {
          promptAction.showToast({ message: '授权失败,需要授权才能操作日历日程' })
          return;
        }
      }
    }).catch((err: BusinessError) => {
      console.error(`requestPermissionsFromUser failed, code is ${err.code}, message is ${err.message}`);
    })
  }
 async changeOrCreatEvent(dict:Record<string,Object>):Promise<void>{
   permissionUtils.checkAccessToken(this.permissions).then((result) => {
     if (result) {
       this.changeOrCreat(dict);
     } else {
       this.reqPermissionsAndRecord(this.permissions)
     }
   })
 }
 private async changeOrCreat(dict:Record<string,Object>){
   const title = dict.title
   const startTime = dict.startTime as number
   const endTime = dict.endTime
   const conferenceID = dict.conferenceID
   if (!title || !startTime || !conferenceID) {
     console.info('日程日历提醒参数错误');
     return;
   }
   const event: calendarManager.Event = {
     type: calendarManager.EventType.NORMAL,
     title:  (dict.title ?? '') as string,
     description: (dict.description ?? '') as string,
     reminderTime: (dict.notifyRemind ?? [0]) as number[],
     startTime: (dict.startTime ?? 0) as number,
     endTime: (dict.endTime ?? 0) as number,
     identifier:(conferenceID ?? '') as string
   };
   this.getCalendar().then(async obj => {
     this.calendar = obj
     this.calendar.setConfig(this.config)
     const eventId = CalendarDataManager.getCalendarData(conferenceID as string)
     if(eventId){
       const events = await this.calendar.getEvents()
       if(events.length > 0){
         for(let i = 0;i < events.length;i++){
           const eventID = events[0].id;
           if(events[i].identifier === conferenceID){
             event.id = eventID;
             this.calendar.updateEvent(event, (err: BusinessError) => {
               if (err) {
                 console.error(`Failed to update event. Code: ${err.code}, message: ${err.message}`);
               } else {
                 console.info("Succeeded in updating event");
               }
             });
             return;
           }
         }
       }
     }else{
       this.calendar.addEvent(event, (err: BusinessError, data: number): void => {
         if (err) {
           console.error(`Failed to addEvent. Code: ${err.code}, message: ${err.message}`);
         } else {
           CalendarDataManager.setCalendarData(conferenceID as string, data.toString() as string);
           console.info(`Succeeded in adding event, id -> ${data}`);
         }
       });
     }
   }).catch((error:Error) => {
     console.error('获取对象时出错:', error);
   });

 }

  async deleteEvent(dict:Record<string,Object>){
    const title = dict.title
    const conferenceID = dict.conferenceID
    if ( !title || !conferenceID) {
      console.info('取消日程日历提醒参数错误');
      return;
    }
    // 使用该函数
    this.getCalendar().then(async obj => {
      this.calendar = obj
      this.calendar.setConfig(this.config)
      const eventId = CalendarDataManager.getCalendarData(conferenceID as string)
      if(eventId){
        // const filter = calendarManager.EventFilter.filterById([Number(eventId)]);
        const events = await this.calendar.getEvents()
        for(let i = 0;i < events.length;i++){
          const eventID = events[0].id;
          if(events[i].identifier === conferenceID){
            this.calendar.deleteEvent(eventID, (err: BusinessError) => {
              if (err) {
                console.error(`Failed to delete event. Code: ${err.code}, message: ${err.message}`);
              } else {
                console.info(`Succeeded in deleting event, err -> ${JSON.stringify(err)}`);
              }
            });
            return;
          }
        }
      }else{
        console.info('没有找到该日程');
        return;
      }
    }).catch((error:Error) => {
      console.error('获取对象时出错:', error);
    });

  }
  async getCalendar():Promise<calendarManager.Calendar>{
    if(this.calendar){
      return(this.calendar);
    }else{
      try {
        let calendar = await this.calendarMgr?.getCalendar();
        if (calendar) {
          this.calendar = calendar;
          return calendar;
        }
      } catch (error) {
        // 处理从第一个源获取对象时可能发生的错误
        console.error('获取calendar对象时出错:', error);
        // 根据你的需求,这里可以选择重新抛出错误或继续尝试
      }
      try {
        let calendar = await this.calendarMgr?.createCalendar(this.calendarAccount);
        this.calendar = calendar;
        return calendar!;
      } catch (error) {
        // 处理从第二个源获取对象时可能发生的错误
        console.error('创建calendar失败:', error);
        // 在这里,你可能需要抛出一个错误,因为没有从任何源获取到对象
        throw new Error('无法从任何源获取对象');
      }
    }
  }
}
阅读 579
1 个回答

根据提供的代码,暂时排查出可能是缺少:ohos.permission.READ\_CALENDAR:用于读取日历日程信息。这个权限导致的没读取到行程信息,请添加后重新试试。更多关于日历服务开发参考:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-calendarmanager-V5

参考下面代码是正常可以添加行程和提醒时间的:

let calendar : calendarManager.Calendar | undefined = undefined;
const date = new Date();
const event: calendarManager.Event = {
  type: calendarManager.EventType.NORMAL,
  id:21,
  title: "测试日历提醒",
  identifier:"966723725",
  reminderTime: [15,30],
  startTime: date.getTime(),
  endTime: date.getTime() + 60 * 60 * 1000
};
let mContext:common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
let calendarMgr = calendarManager.getCalendarManager(mContext);
calendarMgr?.getCalendar().then((data: calendarManager.Calendar) => {
  console.info(`Succeeded in getting calendar, data -> ${JSON.stringify(data)}`);
  calendar = data;
  calendar.addEvent(event, (err: BusinessError, data: number): void => {
    if (err) {
      console.error(`Failed to addEvent. Code: ${err.code}, message: ${err.message}`);
    } else {
      console.info(`Succeeded in adding event, id -> ${data}`);
    }
  });
}).catch((err: BusinessError) => {
  console.error(`Failed to get calendar. Code: ${err.code}, message: ${err.message}`);
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进