1# 日历账户管理
2
3日历账户‌用于存储和管理个人或团队的日程,通过日历账户,用户可以方便地查看、编辑和共享日程信息。
4
5日历管理器[CalendarManager](../reference/apis-calendar-kit/js-apis-calendarManager.md#calendarmanager)用于管理日历账户[Calendar](../reference/apis-calendar-kit/js-apis-calendarManager.md#calendar)。日历账户主要包含账户信息[CalendarAccount](../reference/apis-calendar-kit/js-apis-calendarManager.md#calendaraccount)和配置信息[CalendarConfig](../reference/apis-calendar-kit/js-apis-calendarManager.md#calendarconfig)。
6
7开发者可以创建属于应用特有的日历账户,还可以对日历账户进行新增、删除、更新和查询。此外,每个日程[Event](../reference/apis-calendar-kit/js-apis-calendarManager.md#event)归属于某一个特定的日历账户,可以通过日历账户对该账户下面的日程进行管理,具体相关指导可见[日程管理](calendarmanager-event-developer.md)。
8
9## 接口说明
10
11以下是日历账户管理的相关接口,更多详细接口及使用请参考[@ohos.calendarManager](../reference/apis-calendar-kit/js-apis-calendarManager.md)。
12
13| 接口名称                                                     | 描述                                                         |
14| ------------------------------------------------------------ | ------------------------------------------------------------ |
15| getCalendarManager(context : Context): CalendarManager       | 根据上下文获取日历管理器对象CalendarManager,用于管理日历。  |
16| createCalendar(calendarAccount: CalendarAccount): Promise\<Calendar> | 根据日历账户信息,创建一个Calendar对象,使用Promise异步回调。 |
17| getCalendar(calendarAccount?: CalendarAccount): Promise\<Calendar> | 获取默认Calendar对象或者指定Calendar对象,使用Promise异步回调。<br>默认Calendar是日历存储首次运行时创建的,若创建Event时不关注其Calendar归属,则无须通过createCalendar()创建Calendar,直接使用默认Calendar。 |
18| getAllCalendars(): Promise\<Calendar[]>                      | 获取当前应用所有创建的Calendar对象以及默认Calendar对象,使用Promise异步回调。 |
19| deleteCalendar(calendar: Calendar): Promise\<void>           | 删除指定Calendar对象,使用Promise异步回调。                  |
20| getConfig(): CalendarConfig                                  | 获取日历配置信息。                                           |
21| setConfig(config: CalendarConfig): Promise\<void>            | 设置日历配置信息,使用Promise异步回调。                      |
22| getAccount(): CalendarAccount                                | 获取日历账户信息。                                           |
23
24
25## 开发步骤
26
271. 导入相关依赖。
28
29   ```ts
30   // EntryAbility.ets
31   import {abilityAccessCtrl,AbilityConstant, common, PermissionRequestResult, Permissions, UIAbility, Want } from '@kit.AbilityKit';
32   import { BusinessError } from '@kit.BasicServicesKit';
33   import { calendarManager } from '@kit.CalendarKit';
34   import { window } from '@kit.ArkUI';
35   ```
36
372. 申请权限。使用Calendar Kit时,需要在module.json5中声明申请读写日历日程所需的权限:`ohos.permission.READ_CALENDAR`和`ohos.permission.WRITE_CALENDAR`。具体指导可见[声明权限](../security/AccessToken/declare-permissions.md)。
38
393. 根据上下文获取日程管理器对象calendarMgr,用于对日历账户进行相关管理操作。推荐在`EntryAbility.ets`文件中进行操作。
40
41   ```ts
42   // EntryAbility.ets
43   export let calendarMgr: calendarManager.CalendarManager | null = null;
44
45   export let mContext: common.UIAbilityContext | null = null;
46
47   export default class EntryAbility extends UIAbility {
48     onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
49       console.info("Ability onCreate");
50     }
51
52     onDestroy(): void {
53       console.info("Ability onDestroy");
54     }
55
56     onWindowStageCreate(windowStage: window.WindowStage): void {
57       // Main window is created, set main page for this ability
58       console.info("Ability onWindowStageCreate");
59       windowStage.loadContent('pages/Index', (err, data) => {
60         if (err.code) {
61           console.error(`Failed to load the content. Code: ${err.code}, message: ${err.message}`);
62           return;
63         }
64         console.info(`Succeeded in loading the content. Data: ${JSON.stringify(data)}`);
65       });
66       mContext = this.context;
67       const permissions: Permissions[] = ['ohos.permission.READ_CALENDAR', 'ohos.permission.WRITE_CALENDAR'];
68       let atManager = abilityAccessCtrl.createAtManager();
69       atManager.requestPermissionsFromUser(mContext, permissions).then((result: PermissionRequestResult) => {
70         console.log(`get Permission success, result: ${JSON.stringify(result)}`);
71         calendarMgr = calendarManager.getCalendarManager(mContext);
72       }).catch((error: BusinessError) => {
73         console.error(`get Permission error, error. Code: ${error.code}, message: ${error.message}`);
74       })
75     }
76
77     onWindowStageDestroy(): void {
78       // Main window is destroyed, release UI related resources
79       console.info("Ability onWindowStageDestroy");
80     }
81
82     onForeground(): void {
83       // Ability has brought to foreground
84       console.info("Ability onForeground");
85     }
86
87     onBackground(): void {
88       // Ability has back to background
89       console.info("Ability onBackground");
90     }
91   }
92   ```
93
944. 根据日历账户信息,创建一个日历账户Calendar对象。
95
96   创建日历账户之前,开发者需要先根据账户信息进行查询,如果账户不存在则抛出异常信息,捕获到异常再进行日历账户的创建,否则可能会出现账户重复创建的问题。
97
98   ```ts
99   // Index.ets
100   import { BusinessError } from '@kit.BasicServicesKit';
101   import { calendarMgr } from '../entryability/EntryAbility';
102   import { calendarManager } from '@kit.CalendarKit';
103
104   let calendar: calendarManager.Calendar | undefined = undefined;
105   // 指定日历账户信息
106   const calendarAccount: calendarManager.CalendarAccount = {
107     // 日历账户名称
108     name: 'MyCalendar',
109     // 日历账户类型
110     type: calendarManager.CalendarType.LOCAL,
111     // 日历账户显示名称,该字段如果不填,创建的日历账户在界面显示为空字符串。
112     displayName: 'MyCalendar'
113   };
114   // 创建日历账户
115   calendarMgr?.createCalendar(calendarAccount).then((data: calendarManager.Calendar) => {
116     console.info(`Succeeded in creating calendar data->${JSON.stringify(data)}`);
117     calendar = data;
118     // 请确保日历账户创建成功后,再进行后续相关操作
119     // ...
120   }).catch((error: BusinessError) => {
121     console.error(`Failed to create calendar. Code: ${error.code}, message: ${error.message}`);
122   });
123   ```
124
1255. 日历账户创建之后,日历账户颜色为黑色。开发者需要调用setConfig()接口设置日历配置信息,包括是否打开日历账户下的日程提醒能力、设置日历账户颜色。
126
127   ```ts
128   // Index.ets
129   // 日历配置信息
130   const config: calendarManager.CalendarConfig = {
131     // 打开日程提醒
132     enableReminder: true,
133     // 设置日历账户颜色
134     color: '#aabbcc'
135   };
136   // 设置日历配置信息
137   calendar.setConfig(config).then(() => {
138     console.info(`Succeeded in setting config, data->${JSON.stringify(config)}`);
139   }).catch((err: BusinessError) => {
140     console.error(`Failed to set config. Code: ${err.code}, message: ${err.message}`);
141   });
142   ```
143
1446. 可以查询指定日历账户。
145
146    ```ts
147   // Index.ets
148   calendarMgr?.getCalendar(calendarAccount).then((data: calendarManager.Calendar) => {
149     console.info(`Succeeded in getting calendar, data -> ${JSON.stringify(data)}`);
150   }).catch((err: BusinessError) => {
151     console.error(`Failed to get calendar. Code: ${err.code}, message: ${err.message}`);
152   });
153    ```
154
1557. 也可以查询默认日历账户,默认日历账户是日历存储首次运行时创建的,若创建日程时不关注归属哪个账户,则无须单独创建日历账户,可以直接使用默认日历账户。
156
157    ```ts
158   // Index.ets
159   calendarMgr?.getCalendar().then((data: calendarManager.Calendar) => {
160     console.info(`Succeeded in getting calendar, data -> ${JSON.stringify(data)}`);
161   }).catch((err: BusinessError) => {
162     console.error(`Failed to get calendar. Code: ${err.code}, message: ${err.message}`);
163   });
164    ```
165
1668. 获取当前应用所有创建的日历账户及默认日历账户Calendar对象。
167
168   由于涉及数据隐私安全,进行了权限管控的应用无法获取其他应用创建的账户信息。
169
170   ```ts
171   // Index.ets
172   calendarMgr?.getAllCalendars().then((data: calendarManager.Calendar[]) => {
173     console.info(`Succeeded in getting all calendars, data -> ${JSON.stringify(data)}`);
174     data.forEach((calendar) => {
175       const account = calendar.getAccount();
176       console.info(`account -> ${JSON.stringify(account)}`);
177     })
178   }).catch((err: BusinessError) => {
179     console.error(`Failed to get all calendars. Code: ${err.code}, message: ${err.message}`);
180   });
181   ```
182
1839. 删除指定的日历账户,删除账户后,该账户下的所有日程会全部删除。
184
185    ```ts
186   // Index.ets
187   calendarMgr?.deleteCalendar(calendar).then(() => {
188     console.info("Succeeded in deleting calendar");
189   }).catch((err: BusinessError) => {
190     console.error(`Failed to delete calendar. Code: ${err.code}, message: ${err.message}`);
191   });
192    ```