当前位置: 首页 > news >正文

HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)本地搜索接入方案

一、方案概述
当用户使用应用/元服务时,开发者可以按照标准意图Schema向系统共享数据,并支持意图调用(空调用与传参调用),以实现用户点击卡片后,可后台执行功能(例如播放指定歌曲)或跳转至指定内容页面(例如指定的歌曲播放页面)。

二、意图注册
以歌曲本地搜索特性为例,首先要注册播放歌曲意图(PlayMusic)。开发者需要编辑对应的意图配置PROJECT_HOME/entry/src/main/resources/base/profile/insight_intent.json文件,实现意图注册。

{// 应用支持的意图列表// 必须声明应用支持插件包含的必选意图,应用上架时会进行校验"insightIntents": [{// 意图名称// 名称应当遵循意图框架规范,当前仅支持预置垂域意图,不允许自定义// 应用内意图名称唯一,不允许出现相同的名称定义"intentName": "PlayMusic",// 意图所属的垂域"domain": "MusicDomain",// 意图版本号// 插件引用意图时会校验该版本号,只有和插件定义的版本号一致才能正常调用"intentVersion": "1.0.1",// 意图调用逻辑入口"srcEntry": "./ets/entryability/InsightIntentExecutorImpl.ets","uiAbility": {// 意图所在module、ability,以及代码相对路径入口"ability": "EntryAbility",// UIAbility支持前后台两种执行模式"executeMode": ["background","foreground"]}}]
}

三、端侧意图共享
构建意图对象,并且调用shareIntent(),实现意图共享。可同时构建多个PlayMusic或PlayMusicList的意图对象。

import { insightIntent } from '@kit.IntentsKit';
import { BusinessError } from '@kit.BasicServicesKit';let playMusicIntent1: insightIntent.InsightIntent;
let playMusicIntent2: insightIntent.InsightIntent;
// 共享数据接口  意图数组可以是更多的实体
// 根据实际代码上下文自行传入合适的context
insightIntent.shareIntent(context, [playMusicIntent1, playMusicIntent2]).then(() => {console.info('shareIntent succeed');
}).catch((err: BusinessError) => {console.error(`error.code: ${err?.code}, failed because ${err?.message}`);
});

PlayMusic的意图共享字段定义见各垂域意图Schema定义,代码示例如下:

import { insightIntent } from '@kit.IntentsKit';let playMusicIntent: insightIntent.InsightIntent = {intentName: "PlayMusic",intentVersion: "1.0",identifier: "52dac3b0-6520-4974-81e5-25f0879449b5",intentActionInfo: {actionMode: "EXECUTED",executedTimeSlots: {executedStartTime: 1637393212000,executedEndTime: 1637393112000,},currentPercentage: 50,},intentEntityInfo: {entityName: "Music",entityId: "C10194368",entityGroupId: "C10194321312",displayName: "测试歌曲1",description: "NA",logoURL: "https://www-file.abc.com/-/media/corporate/images/home/logo/abc_logo.png",keywords: ["华为音乐", "化妆"],rankingHint: 99,expirationTime: 1637393212000,metadataModificationTime: 1637393212000,activityType: ["1", "2", "3"],artist: ["测试歌手1", "测试歌手2"],lyricist: ["测试词作者1", "测试词作者2"],composer: ["测试曲作者1", "测试曲作者2"],albumName: "测试专辑",duration: 244000,playCount: 100000,musicalGenre: ["流行", "华语", "金曲", "00后"],isPublicData: false,}
}

完整的意图共享示例如下所示,该示例构建了一个PlayMusic意图,并进行了shareIntent调用。

import { insightIntent } from '@kit.IntentsKit';
import { BusinessError } from '@kit.BasicServicesKit';let playMusicIntent: insightIntent.InsightIntent = {intentName: "PlayMusic",intentVersion: "1.0",identifier: "52dac3b0-6520-4974-81e5-25f0879449b5",intentActionInfo: {actionMode: "EXECUTED",executedTimeSlots: {executedStartTime: 1637393212000,executedEndTime: 1637393112000,},currentPercentage: 50,},intentEntityInfo: {entityName: "Music",entityId: "C10194368",entityGroupId: "C10194321312",displayName: "测试歌曲1",description: "NA",logoURL: "https://www-file.abc.com/-/media/corporate/images/home/logo/abc_logo.png",keywords: ["华为音乐", "化妆"],rankingHint: 99,expirationTime: 1637393212000,metadataModificationTime: 1637393212000,activityType: ["1", "2", "3"],artist: ["测试歌手1", "测试歌手2"],lyricist: ["测试词作者1", "测试词作者2"],composer: ["测试曲作者1", "测试曲作者2"],albumName: "测试专辑",duration: 244000,playCount: 100000,musicalGenre: ["流行", "华语", "金曲", "00后"],isPublicData: false,}
}
// 共享数据接口  意图数组可以是更多的实体
// 根据实际代码上下文自行传入合适的context
insightIntent.shareIntent(context, [playMusicIntent]).then(() => {console.info('shareIntent succeed');
}).catch((err: BusinessError) => {console.error(`error.code: ${err?.code}, failed because ${err?.message}`);
});

四、端侧意图调用
开发者需要自己实现InsightIntentExecutor,并在对应回调实现打开落地页(点击推荐卡片跳转的界面)或后台执行的能力,PlayMusic的意图调用字段定义见各垂域意图Schema。
步骤如下:
继承InsightIntentExecutor。
重写对应方法,例如目标拉起前台页面,则可重写onExecuteInUIAbilityForegroundMode方法。
通过意图名称,识别播放歌曲意图(PlayMusic),在对应的方法中传递意图参数(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 PLAY_MUSIC = 'PlayMusic';/*** 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.PLAY_MUSIC:return this.playMusic(param, pageLoader);default:break;}return Promise.resolve({code: -1,result: {message: 'unknown intent'}} as insightIntent.ExecuteResult)}/*** 实现调用播放歌曲功能** @param param 意图参数* @param pageLoader 窗口*/private playMusic(param: Record<string, Object>, pageLoader: window.WindowStage): Promise<insightIntent.ExecuteResult> {return new Promise((resolve, reject) => {let para: Record<string, string> = {'result': JSON.stringify(param)};let localStorage: LocalStorage = new LocalStorage(para);// TODO 实现意图调用,loadContent的入参为歌曲落地页路径,例如:pages/IndexpageLoader.loadContent('pages/Index', localStorage).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'}})});})}
}

本文主要参考鸿蒙官方网站材料

相关文章:

HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)本地搜索接入方案

一、方案概述 当用户使用应用/元服务时&#xff0c;开发者可以按照标准意图Schema向系统共享数据&#xff0c;并支持意图调用&#xff08;空调用与传参调用&#xff09;&#xff0c;以实现用户点击卡片后&#xff0c;可后台执行功能&#xff08;例如播放指定歌曲&#xff09;或…...

C语言可变参数列表编程实战指南:从基础概念到高级应用的全面解析

引言 在C语言中&#xff0c;可变参数列表的功能使得函数能够灵活地处理不确定数量的输入参数。本文将深入探讨可变参数列表的基础概念、技术原理及其在实际编程中的应用&#xff0c;帮助开发者更好地理解和使用这一特性。 一、可变参数列表的基本概念 1.1 什么是可变参数列表…...

AndroidStudio-文本显示

一、设置文本的内容 1.方式&#xff1a; &#xff08;1&#xff09;在XML文件中通过属性&#xff1a;android:text设置文本 例如&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.andr…...

HBuilderX运行微信小程序,编译的文件在哪,怎么运行

1. 点击HBuilderX顶部的运行-运行到小程序模拟器-微信开发者工具&#xff0c;就会开始编译 2. 编译完成后的文件在根目录找到 unpackage -- dist -- dev -- mp-weixin, 这里面就是编译后的文件&#xff0c;如果未跳转到开发者工具&#xff0c;那可能是没设置启动路径&#xff0…...

百亿AI数字人社会初现:Project Sid展示智能代理文明进化路径

项目背景 Project Sid 是一项开创性的AI代理人文明实验,旨在通过新开发的认知架构 PIANO 探讨AI代理人是否能够在大规模数字社会中实现文明的演进。这项实验不仅展示了社会进步、角色分化、治理体系及文化传播等特征,还揭示了一个包含百亿“数字人类”的社会可能性。 PIANO…...

代码随想录训练营Day21 | 491.递增子序列 - 46.全排列 - 47.全排列 II - 332.重新安排行程 - 51.N皇后 - 37.解数独

491.递增子序列 题目链接&#xff1a;491.递增子序列思路&#xff1a;和子集那道题思路很像&#xff0c;每次在数组中选择一个数&#xff0c;选过的数不能选择&#xff0c;这里要求集合数量必须大于2个才能符合&#xff0c;仍然需要去重&#xff0c;但这里选额的是子序列&…...

多用户商城系统的功能及设计和开发

多用户商城系统的功能及设计与开发&#xff08;基于 PHP MySQL&#xff09; 在现代电子商务平台的开发中&#xff0c;PHP MySQL 是一对非常流行且高效的技术栈。PHP作为服务器端脚本语言&#xff0c;结合MySQL数据库&#xff0c;可以高效地处理多用户商城系统的各种需求。本…...

2024年11月8日day8

半加器和全加器的区别 半加器&#xff1a;只能处理两个二进制位的相加&#xff0c;无法处理进位。全加器&#xff1a;不仅能处理两个二进制位的相加&#xff0c;还能处理来自低位的进位。 ⑴ 完成满足754标准存储格式的浮点数&#xff08;(43940000)16的十进制数值&#xff09…...

Debezium系列之:Debezium3版本增量快照和只读增量快照应用的变化

Debezium系列之:Debezium3版本增量快照和只读增量快照应用的变化 一、需求背景二、基于数据库信号表使用增量快照案例三、基于Kafka信号Topic使用增量快照案例四、只读增量快照案例五、增量快照技术总结增量快照相关知识请阅读博主下面系列文章: Debezium系列之:实现增量快照…...

Python正则表达式1 re.match惰性匹配详解案例

点个关注 re.match() re.match() 函数尝试从字符串的开头开始匹配一个模式&#xff0c;如果匹配成功&#xff0c;返回一个匹配成功的对象&#xff0c;否则返回None。大小写区分&#xff0c;内容匹配不到后面的,只能匹配一个&#xff0c;不能有空格&#xff08;开头匹配&#…...

WPF(C#)学习日志10:Prism框架下按键绑定

在Prism框架下&#xff0c;提供了DelegateCommand类用于处理了UI的按键请求&#xff0c;XAML中可以直接采用 Command"{Binding **}" 来绑定这些方法。这个类是一个泛型的类生命时仅需要DelegateCommand<T>即可&#xff0c;同时在XAML中绑定CommandParameter&qu…...

WPF中的ResizeMode

在 WPF (Windows Presentation Foundation) 中&#xff0c;ResizeMode 属性用于指定窗口是否可以被用户调整大小&#xff0c;以及如何调整大小。ResizeMode 属性可以设置为以下几个值之一&#xff1a; NoResize&#xff1a;窗口不能被用户调整大小&#xff0c;但可以被程序代码…...

Unity3D UI 双击和长按

Unity3D 实现 UI 元素双击和长按功能。 UI 双击和长按 上一篇文章实现了拖拽接口&#xff0c;这篇文章来实现 UI 的双击和长按。 双击 创建脚本 UIDoubleClick.cs&#xff0c;创建一个 Image&#xff0c;并把脚本挂载到它身上。 在脚本中&#xff0c;继承 IPointerClickHa…...

LabVIEW扫描探针显微镜系统

开发了一套基于LabVIEW软件开发的扫描探针显微镜系统。该系统专为微观尺度材料的热性能测量而设计&#xff0c;特别适用于纳米材料如石墨烯、碳纳米管等的研究。系统通过LabVIEW编程实现高精度的表面形貌和热性能测量&#xff0c;广泛应用于科研和工业领域。 项目背景 随着纳…...

问题式教学法在生物教学中的应用探索

问题式教学法在生物教学中的应用探索 李新 山东省德州市平原县第五中学 山东 德州 253100 摘要&#xff1a;时代在发展教育事业也在不断进步&#xff0c;不断创新教学方法有利于提高教学质量。问题教学法能让教材知识点以问题的形式呈现在学生眼前&#xff0c;这对引导学生…...

C++ | Leetcode C++题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; class Solution { public:int nextGreaterElement(int n) {int x n, cnt 1;for (; x > 10 && x / 10 % 10 > x % 10; x / 10) {cnt;}x / 10;if (x 0) {return -1;}int targetDigit x % 10;int x2 n, cnt2 0;for (; x2 …...

实现链式结构二叉树

目录 需要实现的操作 链式结构二叉树实现 结点的创建 前序遍历 中序遍历 后序遍历 计算结点个数 计算二叉树的叶子结点个数 计算二叉树第k层结点个数 计算二叉树的深度 查找值为x的结点 销毁 层序遍历 判断是否为完全二叉树 总结 需要实现的操作 //前序遍历 void …...

在vscode中如何利用git 查看某一个文件的提交记录

在 Visual Studio Code (VSCode) 中&#xff0c;你可以使用内置的 Git 集成来查看某个文件的提交历史。以下是具体步骤&#xff1a; 使用 VSCode 内置 Git 功能 打开项目&#xff1a; 打开你的项目文件夹&#xff0c;确保该项目已经是一个 Git 仓库&#xff08;即项目根目录下…...

【ShuQiHere】️`adb kill-server` 和 `adb start-server` 命令的作用

&#x1f4df;&#x1f527; 【ShuQiHere】️ &#x1f527;&#x1f4df; 在使用 scrcpy 或其他依赖于 ADB&#xff08;Android Debug Bridge&#xff09; 的工具时&#xff0c;您可能会遇到需要重启 ADB 服务器的情况。今天&#xff0c;我们将详细解释两个常用的 ADB 命令&a…...

植物明星大乱斗1

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 scene.hmenuScene.hgameScene.hmainscene.cppmenuScene.cppgameScene.cpp scene.h #pragma once #include <graphics.h>/* 场景菜单角色选择游戏 */ class Scene { public:virtual ~Scene() 0; public:virt…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...