HarmonyOS鸿蒙Next中首次登录日历日程不生效如何解决

HarmonyOS鸿蒙Next中首次登录日历日程不生效如何解决

【问题现象】

首次开启应用时填写日程不生效,关闭后台应用后,再次打开应用填写日程生效。并且首次报错:

E     [calendar_manager_napi.cpp(operator():144)] (ctxt->status 9) failed: GetCalendar failed!

【背景知识】

日历服务开发一般的步骤:

  1. 申请日历读写权限;
  2. 根据上下文获取日程管理器对象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}`);
    })
  }
}
  1. 根据日历账户信息创建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}`);
});
  1. 日程管理等操作。

【定位思路】

calendarManager.getCalendar接口失败的原因一般有:

  1. Permission denied 权限失败,包括未申请日历读写权限、calendarManager.getCalendar接口调用的顺序先于申请日历读写权限。

  2. Parameter error 参数错误,即calendarManager.getCalendar接口传递参数无效。

  3. 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

1 回复

更多关于HarmonyOS鸿蒙Next中首次登录日历日程不生效如何解决的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,首次登录日历日程不生效可能是由于权限未开启或同步问题

检查设备设置中的日历权限,确保已开启。同时,确认账户同步功能是否正常,尝试手动同步日历数据。如果问题依旧,重启设备或重新登录账户可能有助于解决。

回到顶部