HarmonyOS鸿蒙NEXT应用元服务开发Intents Kit(意图框架服务)技能调用接入方案
HarmonyOS鸿蒙NEXT应用元服务开发Intents Kit(意图框架服务)技能调用接入方案
方案概述
开发者需要按照意图定义,进行意图注册并实现意图调用;用户通过对小艺对话进行自然语言输入,小艺理解语义转换成意图调用(含意图参数),执行意图调用实现对应交互体验。
端侧意图注册
以“搜索旅游攻略”特性为例,开发者首先要注册“查看旅游攻略”(ViewTravelGuides)。开发者需要编辑对应的意图配置PROJECT_HOME/entry/src/main/resources/base/profile/insight_intent.json文件,实现意图注册。
{
"insightIntents": [
{
"intentName": "ViewTravelGuides",
"domain": "TravelDomain",
"intentVersion": "1.0.1",
"srcEntry": "./ets/entryability/InsightIntentExecutorImpl.ets",
"uiAbility": {
"ability": "EntryAbility",
"executeMode": [
"background",
"foreground"
]
},
"uiExtension": {
"ability": "insightIntentUIExtensionAbility"
}
}
]
}
配置说明
| 字段 | 说明 | 约束 |
|---|---|---|
| insightIntents | 应用支持的意图API列表 | 必须声明应用支持插件包含的必选API,应用上架时会进行校验。 |
| intentName | 意图API名称 | 名称应当遵循意图框架规范,当前仅支持预置意图API,不允许自定义。应用内意图名称唯一,不允许出现相同的名称定义。 |
| domain | 意图所属的垂域 | - |
| intentVersion | 意图API版本号 | 意图引用API时会校验该版本号,只有和意图定义的版本号一致才能正常调用。具体版本定义参考预置意图API。 |
| srcEntry | 意图API入口代码文件相对路径 | 根据意图API实现业务文件填写。 |
| uiAbility | UIAbility执行配置 | 提供意图执行的前台界面或后台无界面执行时需要进行声明配置。 |
| uiExtension | InsightIntentUIExtensionAbility执行配置 | 提供意图执行的窗口化界面时需要进行声明配置。 |
| ability | 意图调用API所在ability名称 | 本意图API所在的实现ability名称,可根据实际业务命名。 |
| executeMode | 意图执行支持的模式 | 在UIAbility组件中特有属性,包含如下枚举值: background:后台执行,指UIAbility组件的后台执行(无界面)。 foreground:前台执行,指UIAbility组件的前台执行(界面)。 |
端侧前台意图调用
开发者需自己实现InsightIntentExecutor,并在对应回调实现打开落地页(点击推荐卡片跳转的界面,如旅游攻略落页面)的能力,ViewTravelGuides的意图调用字段定义见查看旅游攻略 (ViewTravelGuides)。
步骤如下:
- 继承InsightIntentExecutor。
- 重写对应方法,例如目标拉起前台页面,则可重写onExecuteInUIAbilityForegroundMode方法。
- 通过意图名称,识别查看旅游攻略意图(ViewTravelGuides),在对应的方法中传递意图参数(param),并拉起对应落地页(点击推荐卡片跳转的界面,如旅游攻略落页面)。
import { insightIntent, InsightIntentExecutor } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';
/**
* 意图调用样例 */
export default class InsightIntentExecutorImpl extends InsightIntentExecutor {
private static readonly VIEW_TRAVEL_GUIDES = 'ViewTravelGuides';
/**
* override 执行前台UIAbility意图
*
* @param name 意图名称
* @param param 意图参数
* @param pageLoader 窗口
* @returns 意图调用结果
*/
onExecuteInUIAbilityForegroundMode(name: string, param: Record<string, Object>, pageLoader: window.WindowStage):
Promise<insightIntent.ExecuteResult> {
switch (name) {
case InsightIntentExecutorImpl.VIEW_TRAVEL_GUIDES:
return this.viewTravelGuides(param, pageLoader);
default:
break;
}
return Promise.resolve({
code: -1,
result: {
message: 'unknown intent'
}
} as insightIntent.ExecuteResult)
}
/**
* 实现调用查看旅游攻略功能
*
* @param param 意图参数
* @param pageLoader 窗口
*/
private viewTravelGuides(param: Record<string, Object>, pageLoader: window.WindowStage): Promise<insightIntent.ExecuteResult> {
return new Promise((resolve, reject) => {
// TODO 实现意图调用,loadContent的入参为旅游攻略落地页路径,例如:pages/TravelGuidePage
pageLoader.loadContent('pages/TravelGuidePage')
.then(() => {
let entityId: string = (param.items as Array<object>)?.[0]?.['entityId'];
// TODO 调用成功的情况,此处可以打印日志
resolve({
code: 0,
result: {
message: 'Intent execute succeed'
}
});
})
.catch((err: BusinessError) => {
// TODO 调用失败的情况
resolve({
code: -1,
result: {
message: 'Intent execute failed'
}
})
});
})
}
}
端侧前台窗口意图调用
开发者需自己实现InsightIntentExecutor,并在对应回调实现窗口页面内容加载的能力。
步骤如下:
- 继承InsightIntentExecutor。
- 重写对应方法,例如目标拉起前台窗口化页面,则可重写onExecuteInUIExtensionAbility方法。
- 通过意图名称,识别打开蓝牙意图(LoadBluetoothCard)调用扩展意图,在对应的方法中传递意图参数(param),并拉起对应窗口化页面(如打开蓝牙窗口化页面)
import { insightIntent, InsightIntentExecutor, UIExtensionContentSession } from '@kit.AbilityKit';
/**
* 意图调用样例 */
export default class IntentExecutorImpl extends InsightIntentExecutor {
private static readonly TAG: string = 'IntentExecutorImpl';
private static readonly LOAD_BLUETOOTH_CARD: string = 'LoadBluetoothCard';
/**
* override 执行前台UI扩展意图
*
* @param name 意图名称
* @param param 意图参数
* @param pageLoader 窗口
* @returns 意图调用结果
*/
async onExecuteInUIExtensionAbility(name: string, param: Record<string, Object>,
pageLoader: UIExtensionContentSession):
Promise<insightIntent.ExecuteResult> {
console.info(IntentExecutorImpl.TAG, `onExecuteInUIExtensionAbility`);
switch (name) {
case IntentExecutorImpl.LOAD_BLUETOOTH_CARD:
console.info(IntentExecutorImpl.TAG, `onExecuteInUIAbilityForegroundMode::ForegroundUiAbility intent`);
return this.openLoadBluetoothCard(pageLoader);
default:
console.info(IntentExecutorImpl.TAG, `onExecuteInUIAbilityForegroundMode::invalid intent`);
break;
}
let result: insightIntent.ExecuteResult = {
code: -1,
result: {
message: 'onExecuteInUIExtensionAbility failed'
}
};
return result;
}
/**
* 打开加载蓝牙卡片意图
*
* @param pageLoader 意图内容Session对象
* @returns 执行结果
*/
private async openLoadBluetoothCard(pageLoader: UIExtensionContentSession): Promise<insightIntent.ExecuteResult> {
pageLoader.loadContent('pages/UiExtensionPage');
let result: insightIntent.ExecuteResult = {
code: 0,
result: {
message: 'intent execute succeed'
}
}
return result;
}
}
本文主要参考鸿蒙官方网站材料
更多关于HarmonyOS鸿蒙NEXT应用元服务开发Intents Kit(意图框架服务)技能调用接入方案的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙NEXT中,应用元服务开发Intents Kit(意图框架服务)技能调用接入方案如下:
首先,开发者需在应用的config.json文件中声明Intent过滤器,定义应用支持的Intent类型。
接着,使用Intent类创建并配置具体的Intent对象,包括Action、Category、Data等属性。
然后,通过startAbility或startAbilityForResult方法启动指定的Ability,实现技能调用。
开发者还需处理Intent的响应,确保应用能正确解析并执行相关操作。


