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

2 回复

在HarmonyOS鸿蒙NEXT中,Intents Kit(意图框架服务)是用于实现应用间通信和任务调用的关键组件。开发者可以通过Intents Kit定义和调用特定的技能(Skill),以实现跨应用的协同工作。技能调用接入方案主要包括以下几个步骤:

  1. 技能定义:在config.json文件中定义技能的actionsentities,明确技能的行为和参数。例如:

    {
      "abilities": [
        {
          "name": ".MainAbility",
          "skills": [
            {
              "actions": [
                "action.example.OPEN"
              ],
              "entities": [
                "entity.example.URL"
              ]
            }
          ]
        }
      ]
    }
    
  2. 技能调用:通过Intent对象发起技能调用,指定actionentities。例如:

    let intent = {
      action: "action.example.OPEN",
      entities: [
        {
          entity: "entity.example.URL",
          value: "https://example.com"
        }
      ]
    };
    this.context.startAbility(intent);
    
  3. 技能处理:在目标应用的Ability中处理传入的Intent,执行相应的逻辑。例如:

    onNewWant(want) {
      if (want.action === "action.example.OPEN") {
        let url = want.entities[0].value;
        // 处理URL
      }
    }
    
  4. 权限配置:确保在config.json中配置必要的权限,以支持技能调用。例如:

    {
      "reqPermissions": [
        {
          "name": "ohos.permission.INTERNET"
        }
      ]
    }
    

通过以上步骤,开发者可以在HarmonyOS鸿蒙NEXT中实现技能调用接入,提升应用间的交互能力。

更多关于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等属性。

然后,通过startAbilitystartAbilityForResult方法启动指定的Ability,实现技能调用。

开发者还需处理Intent的响应,确保应用能正确解析并执行相关操作。

回到顶部