自学记录鸿蒙API 13:Calendar Kit日历功能从学习到实践

这次的目标是学习和使用HarmonyOS的Calendar Kit功能,特别是最新的API 13版本。Calendar Kit让我感受到了一种与传统开发完全不同的体验——它提供的不只是简单的日历功能,而是一套集创建、查询、更新、删除等强大能力于一体的日程管理服务。

一开始,我仅仅是希望开发一个能够管理日常工作和个人事务的小工具。但随着学习的深入,我意识到这个模块的潜力远远超出了我的预期。于是,带着对HarmonyOS的浓厚兴趣,我决定通过实际开发一个完整的日程管理应用,将理论和实践结合起来,全面探索Calendar Kit的功能。


第一部分:构建基础——获取日历管理器

每个优秀的应用都有一个强大的核心,在Calendar Kit中,这个核心就是CalendarManager。它是我们与日历和日程打交道的桥梁。通过它,我们可以完成从创建日历到操作日程的一切功能。

在开始之前,我们需要请求用户权限,因为日历涉及隐私信息,需要
ohos.permission.READ_CALENDAR和ohos.permission.WRITE_CALENDAR权限。

代码实现:初始化CalendarManager

以下是获取CalendarManager对象的代码实现:

import { calendarManager } from '@kit.CalendarKit';
import { Permissions, abilityAccessCtrl, common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

let calendarMgr: calendarManager.CalendarManager | null = null;
let mContext: common.UIAbilityContext | null = null;

async function initializeCalendarManager() {
    try {
        const permissions = ['ohos.permission.READ_CALENDAR', 'ohos.permission.WRITE_CALENDAR'];
        const atManager = abilityAccessCtrl.createAtManager();
        await atManager.requestPermissionsFromUser(mContext, permissions);
        console.info('权限请求成功');
        calendarMgr = calendarManager.getCalendarManager(mContext);
        console.info('CalendarManager 初始化成功');
    } catch (error) {
        console.error('初始化失败:', error);
    }
}

我的思考

权限请求是开发中的第一步,也是与用户交互的重要环节。通过清晰的提示,让用户理解为何需要这些权限,既能提升用户体验,也有助于合规开发。


第二部分:管理日历——从创建到配置

在获得CalendarManager对象后,我们可以通过它创建和管理多个日历。一个日历是管理日程的容器,因此,为不同的用途创建独立的日历是非常有必要的。

代码实现:创建日历

以下代码展示了如何使用createCalendar方法创建一个日历:

const calendarAccount: calendarManager.CalendarAccount = {
    name: 'MyWorkCalendar',
    type: calendarManager.CalendarType.LOCAL,
    displayName: '工作日历'
};

async function createCalendar() {
    try {
        const calendar = await calendarMgr?.createCalendar(calendarAccount);
        console.info(`日历创建成功: ${JSON.stringify(calendar)}`);
        return calendar;
    } catch (error) {
        console.error('创建日历失败:', error);
    }
}

配置日历

创建日历后,我们可以通过setConfig方法为其添加配置,例如是否启用提醒、设置颜色等:

const calendarConfig: calendarManager.CalendarConfig = {
    enableReminder: true,
    color: '#FF5733'
};

async function configureCalendar(calendar: calendarManager.Calendar) {
    try {
        await calendar.setConfig(calendarConfig);
        console.info('日历配置成功');
    } catch (error) {
        console.error('配置日历失败:', error);
    }
}

我的思考

我特别喜欢通过颜色区分不同的日历类型。比如,为工作日历设置红色,为个人日历设置蓝色,这种视觉化的管理方式让信息一目了然。


第三部分:日程管理——让生活井井有条

有了日历后,我们可以通过它添加日程。addEvent方法让我们能够轻松地创建一个事件,并为其添加标题、时间、描述等信息。

代码实现:添加日程

以下代码展示了如何向日历中添加一个会议事件:

const event: calendarManager.Event = {
    title: '团队会议',
    type: calendarManager.EventType.NORMAL,
    startTime: Date.now() + 60 * 60 * 1000, // 1小时后
    endTime: Date.now() + 2 * 60 * 60 * 1000, // 2小时后
    location: { location: '会议室1', latitude: 0, longitude: 0 },
    description: '讨论项目进展',
    reminderTime: [10] // 提前10分钟提醒
};

async function addEvent(calendar: calendarManager.Calendar) {
    try {
        const eventId = await calendar.addEvent(event);
        console.info(`日程添加成功,ID: ${eventId}`);
    } catch (error) {
        console.error('添加日程失败:', error);
    }
}

第四部分:查询与筛选——精准管理日程

当日程变得越来越多时,查询和筛选就显得尤为重要。Calendar Kit 提供了丰富的查询功能,比如通过标题、时间或ID来筛选事件。

代码实现:按标题查询

以下代码展示了如何通过标题模糊查询日程:

async function getEventsByTitle(calendar: calendarManager.Calendar, title: string) {
    try {
        const filter = calendarManager.EventFilter.filterByTitle(title);
        const events = await calendar.getEvents(filter);
        console.info(`查询到的日程: ${JSON.stringify(events)}`);
    } catch (error) {
        console.error('查询日程失败:', error);
    }
}

我的思考

模糊查询非常适合快速定位某类任务。例如,搜索“会议”可以找到所有与会议相关的日程,这在实际应用中极具实用价值。


第五部分:实战项目——智能日程管理工具

基于以上功能,我开发了一个智能日程管理应用。用户可以通过简洁的界面添加、查看和管理日程。

功能展示:创建新日程的UI组件

@Entry
@Component
struct CreateEventPage {
    @State title: string = '';
    @State description: string = '';
    @State startTime: string = '';
    @State endTime: string = '';

    build() {
        Column() {
            TextField({ text: this.title, placeholder: '请输入标题' })
                .onChange((value: string) => this.title = value);

            TextField({ text: this.description, placeholder: '请输入描述' })
                .onChange((value: string) => this.description = value);

            TextField({ text: this.startTime, placeholder: '开始时间 (YYYY-MM-DD HH:MM)' })
                .onChange((value: string) => this.startTime = value);

            TextField({ text: this.endTime, placeholder: '结束时间 (YYYY-MM-DD HH:MM)' })
                .onChange((value: string) => this.endTime = value);

            Button('创建日程')
                .onClick(async () => {
                    await addEvent({
                        title: this.title,
                        description: this.description,
                        startTime: new Date(this.startTime).getTime(),
                        endTime: new Date(this.endTime).getTime()
                    });
                });
        }
    }
}

智能化亮点

  • 可视化管理:通过颜色和图标区分不同类型的日历和事件。
  • 模糊查询:支持按标题或时间快速搜索。
  • 智能提醒:根据用户设置的时间提前提醒重要任务。

总结:我的收获与展望

在这次学习和实践中,我不仅熟悉了HarmonyOS Calendar Kit的强大功能,还深刻体会到模块化开发的便捷与高效。它让我能够快速构建出一套功能完善的日程管理应用,满足不同用户的需求。

接下来,我计划整合语音助手功能,实现语音创建日程;同时,加入通知服务和AI推荐,让应用更智能、更贴近用户需求。

当然如果你也在这一领域研究,不妨关注我,我们一起进步~!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/946168.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汽车损坏识别检测数据集,使用yolo,pasical voc xml,coco json格式标注,6696张图片,可识别11种损坏类型,识别率89.7%

汽车损坏识别检测数据集,使用yolo,pasical voc xml,coco json格式标注,6696张图片,可识别11种损坏类型损坏: 前挡风玻璃(damage-front-windscreen ) 损坏的门 (damaged-d…

2025年入职/转行网络安全,该如何规划?网络安全职业规划

网络安全是一个日益增长的行业,对于打算进入或转行进入该领域的人来说,制定一个清晰且系统的职业规划非常重要。2025年,网络安全领域将继续发展并面临新的挑战,包括不断变化的技术、法规要求以及日益复杂的威胁环境。以下是一个关…

如何使用 ChatGPT Prompts 写学术论文?

第 1 部分:学术写作之旅:使用 ChatGPT Prompts 进行学术写作的结构化指南 踏上学术写作过程的结构化旅程,每个 ChatGPT 提示都旨在解决特定方面,确保对您的主题进行全面探索。 制定研究问题: “制定一个关于量子计算的社会影响的研究问题,确保清晰并与您的研究目标保持一…

超大规模分类(一):噪声对比估计(Noise Contrastive Estimation, NCE)

NCE损失对应的论文为《A fast and simple algorithm for training neural probabilistic language models》,发表于2012年的ICML会议。 背景 在2012年,语言模型一般采用n-gram的方法,统计单词/上下文间的共现关系,比神经概率语言…

位置编码--RPE

相对位置编码 (Relative Position Encoding, RPE) 1. 相对位置编码 相对位置编码是 Transformer 中的一种改进位置编码方式,它的主要目的是通过直接建模序列中元素之间的相对位置,而不是绝对位置,从而更好地捕捉序列元素之间的依赖关系&#…

2024年12月31日Github流行趋势

项目名称:free-programming-books 项目地址url:https://github.com/EbookFoundation/free-programming-books项目语言:HTML历史star数:344575今日star数:432项目维护者:vhf, eshellman, davorpa, MHM5000, …

mysql下载安装及配置

基本操作参考:https://www.cnblogs.com/zhangkanghui/p/9613844.html ----------------------------------其余常见问题参考下面: 都需要管理员权限 输入命令查看端口号占用,然后kill掉

RoboMIND:多体现基准 机器人操纵的智能规范数据

我们介绍了 RoboMIND,这是机器人操纵的多体现智能规范数据的基准,包括 4 个实施例、279 个不同任务和 61 个不同对象类别的 55k 真实世界演示轨迹。 工业机器人企业 埃斯顿自动化 | 埃夫特机器人 | 节卡机器人 | 珞石机器人 | 法奥机器人 | 非夕科技 | C…

【Spring MVC 核心机制】核心组件和工作流程解析

在 Web 应用开发中,处理用户请求的逻辑常常会涉及到路径匹配、请求分发、视图渲染等多个环节。Spring MVC 作为一款强大的 Web 框架,将这些复杂的操作高度抽象化,通过组件协作简化了开发者的工作。 无论是处理表单请求、生成动态页面&#x…

郑州时空-TMS运输管理系统 GetDataBase 信息泄露漏洞复现

0x01 产品简介 郑州时空-TMS运输管理系统是一款专为物流运输企业设计的综合性管理软件,旨在提高运输效率、降低运输成本,并实现供应链的协同运作。系统基于现代计算机技术和物流管理方法,结合了郑州时空公司的专业经验和技术优势,为物流运输企业提供了一套高效、智能的运输…

电子应用设计方案81:智能AI冲奶瓶系统设计

智能 AI 冲奶瓶系统设计 一、引言 智能 AI 冲奶瓶系统旨在为父母或照顾者提供便捷、准确和卫生的冲奶服务,特别是在夜间或忙碌时,减轻负担并确保婴儿获得适宜的营养。 二、系统概述 1. 系统目标 - 精确调配奶粉和水的比例,满足不同年龄段婴…

Three.js教程004:坐标辅助器与轨道控制器

文章目录 坐标辅助器与轨道控制器实现效果添加坐标辅助器添加轨道控制器完整代码完整代码下载坐标辅助器与轨道控制器 实现效果 添加坐标辅助器 创建坐标辅助器: const axesHelper = new Three.AxesHelper(5);添加到场景中: scene.

Mesh网格数据结构2-半边结构

文章目录 1.Edge-based data Structure2.HalfEdge-Based Data Structure3. Directed-edge data structure 本文将详细介绍半边结构(Halfedge-based data),以及Face-based data,Edge-based data, Directed-edge data structure. 上…

CSS---实现盒元素div内input/textarea的focus状态时给父元素加属性!

注意兼容性,低版本浏览器无效 要实现当 textarea 文本框获得焦点时,自动给其父元素添加类名或样式,您可以使用 CSS 的 :focus-within 伪类选择器。这个选择器会在元素本身或其任何子元素获得焦点时应用样式。 示例代码 假设您有以下 HTML 结…

天天跳绳(???)

广东省人民政府门户网站 https://www.gd.gov.cn/zwgk/zdlyxxgkzl/whjg/content/post... 二沙岛变身智能“运动岛” - 广东省人民政府门户网站 2020年10月20日  广州二沙岛,犹如一颗璀璨明珠点缀在珠江之心,自然风光旖旎,功能分区清 … 公共…

七、Vue 监听属性

文章目录 一、简介二、基本语法简单监听深度监听 三、与计算属性的区别计算属性(computed)的特点监听属性和计算属性的不同应用场景 四、在组件中的应用组件内监听属性父子组件通信中的监听属性 五、注意事项异步操作不要过度使用 一、简介 在 Vue.js 中…

视频流媒体解决方案:Liveweb国标GB28181视频监控汇聚平台

视频监控国标平台指的是基于GB/T 28181协议的视频联网平台,可以对接各种符合国标GB/T 28181协议的视频平台、NVR录像机、网络监控摄像头、执法记录仪、应急布控球、移动单兵、无人机等设备。通过国标平台的联网,方便管理分布在不同地点的视频监控和其他视…

Canoe 新建工程和通道连接

文章目录 新建工程硬件通道Vector 硬件驱动Hardware 配置1、通道数量配置2、通道映射3、配置通道波特率 新建工程 新建一个具有一个CAN通道的工程 Ctrl S 保存 硬件通道 以 Vector 1640 为例: Vector 1640通过 USB 和电脑连接后,观察指示灯&#xff…

安卓开发使用Gemini高效AI开发-Android Studio 中使用Gemini

Gemini 是Android Studio最新版本中内嵌的AI工具,它可以通过代码补全、解释代码、提供改进建议、错误分析等方式帮助开发者提高编码效率。当然,与目前大多数AI工具一样,Gemini有时可能会"非常自信"地提供不准确、错误的信息&#x…

从0开始的docker镜像制作-ubuntu22.04

从0开始的docker镜像制作-ubuntu22.04 一、拉取基础ubuntu22.04镜像二、进入拉取的docker镜像中,下载自己需要的安装包三、安装需要的系统软件四、打包现有镜像为一个新的镜像五、推送打包的镜像到私有docker服务器1.编辑docker文件,使其允许http传输和对…