在鸿蒙生态(HarmonyOS)中,Skill 是实现智能语音助手、意图识别和跨设备服务调用的核心机制之一。通过 Skill,你的应用可以被小艺(Celia)语音唤醒、响应用户自然语言指令,甚至与其他设备上的服务无缝协作。
本文将用 5 分钟时间,带你快速理解 Skill 的基本概念,并演示如何在 HarmonyOS 应用中注册并使用一个简单的自定义 Skill。
一、什么是 HarmonyOS Skill?
Skill 是 HarmonyOS 提供的一种服务能力单元,用于描述“我能做什么”。它基于 意图(Intent) 模型,将用户语音或文本指令映射到具体的功能逻辑。
例如:
- 用户说:“打开天气应用查看北京天气”
- 系统识别出意图
VIEW_WEATHER,并携带参数{city: "北京"} - 你的应用通过注册对应 Skill 响应该意图,启动页面并展示数据
💡 Skill 类似于 Android 的 App Actions 或 iOS 的 Siri Shortcuts,但深度集成于鸿蒙分布式架构。
二、5 分钟实战:创建一个“打招呼”Skill
我们将创建一个简单 Skill:当用户对小艺说“让 MyApp 打个招呼”,应用弹出“Hello, HarmonyOS!”。
步骤 1:配置 config.json
在 module.json5(或旧版 config.json)中注册 Skill:
{
"module": {
"skills": [
{
"name": "com.example.myapp.GreetSkill",
"type": "voice",
"description": "响应打招呼指令",
"actions": [
{
"name": "greet_user",
"entities": []
}
]
}
],
"abilities": [
{
"name": "MainAbility",
"srcEntry": "./ets/entryability/EntryAbility.ets",
"skills": [
{
"actions": ["greet_user"]
}
]
}
]
}
}
✅ 注意:
skills定义能力,abilities中的skills字段将其绑定到具体 Ability。
步骤 2:在 Ability 中处理 Skill 调用
在 EntryAbility.ets 中重写 onNewWant 方法(用于接收外部拉起):
import UIAbility from '@ohos.app.ability.UIAbility';
export default class EntryAbility extends UIAbility {
onNewWant(want) {
// 检查是否由 Skill 触发
if (want.action === 'greet_user') {
// 可在此启动特定页面或执行逻辑
console.log('收到打招呼指令!');
// 示例:弹出提示(需在 UI 线程)
// 此处简化,实际应在页面中通过 ArkTS 显示
}
}
}
🔔 提示:若需跳转到具体页面,可在
onNewWant中调用this.context.startAbility()启动目标页面,并传递参数。
步骤 3:(可选)配置语音触发语料
为了让小艺识别“让 MyApp 打个招呼”,需在 华为开发者联盟后台 提交语音模板(目前部分能力需审核):
-
意图名称:
greet_user -
示例语句:
- “让 MyApp 打个招呼”
- “叫 MyApp 问好”
🌐 注:本地调试可使用 DevEco Studio 的模拟器 + Intent 模拟工具 测试,无需真实语音。
三、调试技巧
- 使用 DevEco Studio 的“Intent 模拟器”
在运行配置中选择 “Edit Configurations” → 添加 “Intent” 启动方式,填入action: greet_user即可模拟 Skill 调用。 - 查看日志
通过hdc shell或 DevEco Log 工具观察onNewWant是否被触发。 - 权限声明
若涉及敏感操作,需在module.json5中声明相应权限(如ohos.permission.INTERNET)。
四、进阶方向
- 使用 Entity 传递参数(如城市名、时间等)
- 实现 Service Ability 响应后台 Skill 请求
- 结合 元服务(Meta Service) 实现免安装卡片式交互
- 接入 小艺开放平台,支持更多自然语言表达
结语
Skill 是 HarmonyOS 构建智能、主动、跨端服务的关键入口。虽然本文仅展示了最基础的用法,但已为你打开了通往“语音驱动应用”的大门。只需 5 分钟配置,你的应用就能听懂用户说话!