HarmonyOS鸿蒙Next中首次登录日历日程不生效如何解决
HarmonyOS鸿蒙Next中首次登录日历日程不生效如何解决
【问题现象】
首次开启应用时填写日程不生效,关闭后台应用后,再次打开应用填写日程生效。并且首次报错:
E [calendar_manager_napi.cpp(operator():144)] (ctxt->status 9) failed: GetCalendar failed!
【背景知识】
日历服务开发一般的步骤:
- 申请日历读写权限;
- 根据上下文获取日程管理器对象calendarMgr,用于对日历账户进行相关管理操作。推荐在EntryAbility.ets文件中进行操作。
// EntryAbility.ets
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 {
// Main window is created, set main page for this ability
console.info("Ability onWindowStageCreate");
windowStage.loadContent('pages/Index', (err, data) => {
if (err.code) {
console.error(`Failed to load the content. Code: ${err.code}, message: ${err.message}`);
return;
}
console.info(`Succeeded in loading the content. Data: ${JSON.stringify(data)}`);
});
mContext = this.context;
const permissions: Permissions[] = ['ohos.permission.READ_CALENDAR', 'ohos.permission.WRITE_CALENDAR'];
let atManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(mContext, permissions).then((result: PermissionRequestResult) => {
console.log(`get Permission success, result: ${JSON.stringify(result)}`);
calendarMgr = calendarManager.getCalendarManager(mContext);
}).catch((error: BusinessError) => {
console.error(`get Permission error, error. Code: ${error.code}, message: ${error.message}`);
})
}
}
- 根据日历账户信息创建Calendar对象,用于进行日程管理。
// Index.ets
import { BusinessError } from '@kit.BasicServicesKit';
import { calendarMgr } from '../entryability/EntryAbility';
import { calendarManager } from '@kit.CalendarKit';
let calendar: calendarManager.Calendar | undefined = undefined;
// 指定日历账户信息
const calendarAccount: calendarManager.CalendarAccount = {
name: 'MyCalendar',
type: calendarManager.CalendarType.LOCAL,
// 日历账户显示名称,该字段如果不填,创建的日历账户在界面显示为空字符串。
displayName: 'MyCalendar'
};
// 日历配置信息
const config: calendarManager.CalendarConfig = {
// ...
};
// 创建日历账户
calendarMgr?.createCalendar(calendarAccount).then((data: calendarManager.Calendar) => {
console.info(`Succeeded in creating calendar data->${JSON.stringify(data)}`);
calendar = data;
// 请确保日历账户创建成功后,再进行相关日程的管理
// 设置日历配置信息,打开日程提醒、设置日历账户颜色 ...
}).catch((error: BusinessError) => {
console.error(`Failed to create calendar. Code: ${error.code}, message: ${error.message}`);
});
- 日程管理等操作。
【定位思路】
calendarManager.getCalendar接口失败的原因一般有:
-
Permission denied 权限失败,包括未申请日历读写权限、calendarManager.getCalendar接口调用的顺序先于申请日历读写权限。
-
Parameter error 参数错误,即calendarManager.getCalendar接口传递参数无效。
-
Capability not supported 日历能力不支持。
从这三个典型失败场景排查,本问题是“日历日程首次开启应用填写日程不生效,关闭后台应用后,再次打开应用填写日程生效。”,可以看出问题原因是calendarManager.getCalendar接口调用的顺序先于申请日历读写权限。因为calendarManager.getCalendar接口顺序先于申请日历读写权限,导致首次打开应用日程操作报错,再次打开应用填写没问题的原因是,后面权限获取到了,再执行就没问题。
【解决方案】
使用Calendar Kit时,需要在module.json5中声明申请读写日历日程所需的权限:ohos.permission.READ_CALENDAR和ohos.permission.WRITE_CALENDAR。
"requestPermissions": [
{
"name": "ohos.permission.READ_CALENDAR",
"reason": "$string:reason_read_calendar",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "inuse"
}
},
{
"name": "ohos.permission.WRITE_CALENDAR",
"reason": "$string:reason_write_calendar",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "inuse"
}
}
]
并在代码中确保显示调用申请日历服务读写权限,在权限申请的成功回调中获取getCalendarManager,然后再使用calendarMgr进行日程管理等操作。
const permissions: Permissions[] = ['ohos.permission.READ_CALENDAR', 'ohos.permission.WRITE_CALENDAR'];
let atManager = abilityAccessCtrl.createAtManager();
// 1.申请日历服务读写权限
atManager.requestPermissionsFromUser(mContext, permissions).then((result: PermissionRequestResult) => {
console.log(`get Permission success, result: ${JSON.stringify(result)}`);
// 2.在成功回调中获取getCalendarManager
calendarMgr = calendarManager.getCalendarManager(mContext);
}).catch((error: BusinessError) => {
console.error(`get Permission error, error. Code: ${error.code}, message: ${error.message}`);
})
// 3.进行日程管理等操作
calendar.addEvent(event).then((data: number) => {
console.info(`Succeeded in adding event, id -> ${data}`);
}).catch((err: BusinessError) => {
console.error(`Failed to addEvent. Code: ${err.code}, message: ${err.message}`);
});
更多关于HarmonyOS鸿蒙Next中首次登录日历日程不生效如何解决的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS鸿蒙Next中首次登录日历日程不生效如何解决的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,首次登录日历日程不生效可能是由于权限未开启或同步问题
检查设备设置中的日历权限,确保已开启。同时,确认账户同步功能是否正常,尝试手动同步日历数据。如果问题依旧,重启设备或重新登录账户可能有助于解决。