我使用一个单例创建了一个日程管理类,我使用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('无法从任何源获取对象');
}
}
}
}
根据提供的代码,暂时排查出可能是缺少:ohos.permission.READ\_CALENDAR:用于读取日历日程信息。这个权限导致的没读取到行程信息,请添加后重新试试。更多关于日历服务开发参考:
https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-calendarmanager-V5
参考下面代码是正常可以添加行程和提醒时间的: