意图框架习惯推荐方案,为用户提供个性化内容分发

news/2025/2/28 13:05:12/文章来源:https://www.cnblogs.com/HarmonyOSSDK/p/18670931

在快速发展的现代生活中,用户面临着时间紧迫、信息过载和决策困难等痛点。例如新闻资讯过多,寻找感兴趣的内容费时费力;音乐和视频服务推荐内容不符合个人口味等。这些痛点,无疑增加了用户的烦恼,也给应用的开发者带来了挑战:如何更好识别用户意图,实现精准推荐,提高应用打开和使用频率?

基于此,HarmonyOS SDK意图框架服务(Intents Kit)提供习惯推荐方案,是HarmonyOS学习用户的行为习惯后做出的主动预测推荐。开发者将用户在应用/元服务内的使用行为向HarmonyOS共享,使得HarmonyOS可以基于共享的数据学习用户的行为习惯。在HarmonyOS学习到用户的行为习惯后,会给用户推荐相应功能,并且尝试补充详细功能参数,减少用户执行任务的步骤。

image

这种推荐机制不仅让用户更容易发现并使用他们感兴趣的内容和服务,也显著提高了开发者的点击率和转化率。为了简化开发者的接入流程,意图框架智慧分发提供了多种特性类别,当前已开放习惯推荐、事件推荐、技能调用-语音、本地搜索,后续会陆续开放其他特性类别。

场景体验

当前习惯推荐可在小艺建议入口分发,在不同垂域中,填充功能详细参数或内容的逻辑不同,主要典型场景可分为常用接续、常用复访、常用推新三类。以常看视频续播为例,系统预测当前用户使用华为视频的播放视频功能概率较高,会选择用户最近观看且还没看完的视频内容来补充功能细节,在小艺建议中以模板卡形式推荐展示,用户点击卡片后,实现一步跳转进应用的视频播放页。

image

卡片展示效果

意图框架提供各垂域习惯推荐在小艺建议中展示使用的标准模板卡片,开发者无需开发展示卡片。在展示模板上,会展示应用/元服务名称与logo和内容必要信息,比如音乐名、音乐图片,这类参数需要开发者共享到系统。
以下为播放歌曲-习惯推荐的卡片示例。

image

接入方案

方案概述

当用户在应用/元服务内使用功能时,开发者需要按照标准意图Schema向系统共享行为数据,并支持意图调用(空调用与传参调用),以实现用户点击模板卡后跳转回对应页面。

image

意图注册

以歌曲续听推荐特性为例,首先要注册播放歌曲意图(PlayMusic),其他意图见各垂域意图Schema。开发者需要编辑对应的意图配置
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}`);
});

端侧意图调用

意图执行组件为uiAbility的意图调用

如上文意图注册,当开发者注册的意图承载的运行组件为uiAbility时,开发者需要自己实现InsightIntentExecutor,并在对应回调实现打开落地页(点击推荐卡片跳转的界面)的能力,PlayMusic的意图调用字段定义见各垂域意图Schema。

步骤如下:

1.继承InsightIntentExecutor。

2.重写对应方法,例如目标拉起前台页面,则可重写

onExecuteInUIAbilityForegroundMode方法。

3.通过意图名称,识别播放歌曲意图(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'}})});})}
}

意图执行组件为form的意图调用

如上文意图注册,当开发者注册的意图承载的运行组件为form(运行组件FormExtensionAbility)时,则需要开发者在实现的FormExtensionAbility中从want中获取并解析意图名和执行参数,用于卡片展示。

步骤如下:

1.在意图执行绑定FormExtensionAbility的onAddForm(want: Want)中获取运行态意图框架传入的意图名(预定义keyName为
ohos.insightIntent.executeParam.name)和意图执行参数(预定义keyName为ohos.insightIntent.executeParam.param);

2.通过意图名称,识别播放歌曲意图(PlayMusic),在对应的方法中传递意图参数(param),并加载对应数据用于卡片展示。

import { Want } from '@kit.AbilityKit';
import { formBindingData, FormExtensionAbility } from '@kit.FormKit';/*** 卡片意图调用示例*/
export default class LoadCardFormAbility extends FormExtensionAbility {onAddForm(want: Want): formBindingData.FormBindingData {if (want?.parameters?.['ohos.insightIntent.executeParam.name'] != undefined) {const intentName = want.parameters['ohos.insightIntent.executeParam.name']; //意图名//TODO: 根据意图名称分发处理逻辑,若仅一个卡片意图,则可以忽略}if (want?.parameters?.['ohos.insightIntent.executeParam.param'] != undefined) {const executeParameter = want.parameters['ohos.insightIntent.executeParam.param']; //意图执行参数//TODO: 从 executeParameter 中解析具体意图执行参数,用于卡片内容展示}let formData = ''; //TODO: 仅示例,根据具体逻辑封装return formBindingData.createFormBindingData(formData);}
}

了解更多详情>>

访问意图框架服务联盟官网

获取习惯推荐方案开发指导文档

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[ABC136F] Enclosed Points

前言 模拟赛 \(\rm{T1}\) , 全世界都切出来了 思路 首先容易想到换贡献主体, 容易想到按点计算贡献 (所以我赛时为什么叉掉这个直接去按矩阵算贡献了, 无语) 考虑对于一个点, 其贡献的来源: 只要有一个子集构成的矩形包含它, 就会产生贡献 问题转化为对于一个点, 有多少个子集包…

IDEA中如何查看最近打开过的文件?

前言 大家好,我是小徐啊。我们在Java开发的时候,最重要的是选择一款合适的开发工具,像eclipse,IDEA等。其中,IDEA是我平时在开发的时候,用的那一款工具,它功能十分强大。今天,我要来介绍下它的一个功能,就是查看下最近打开过的文件。 IDEA如何查看最近打开的文件 首先…

【邮件钓鱼】技术干货:从伪造域名到隐藏链接,攻防实战详解(中)

0x01 前言 ★ 声明:未知攻焉知防,本文以安全教育为主,不可用于违法行为,造成的一切后果,与本人无关。邮件伪造是信息安全中的常见手段之一,很多人在实践中因不了解核心原理而踩坑。本篇将结合实践经验,系统讲解邮件伪造的原理与操作方法。 如果对 SPF 和 DKIM 验证原理不…

达梦sqllog慢日志配置方案,抓取用户所有的操作记录

很多用户反馈,开启审计影响数据库性能,但是不开启审计,数据库没保障,数据无安全性,误删了数据,无法找到记录 达梦慢日志可以配置下,记录用户的操作记录mkdir -p /data/dmlog/log vi /data/dmdb/sqllog.ini BUF_TOTAL_SIZE = 10240 #SQL 日志 buffer 占用空间的上限,单…

自动化办公效率工具如何提升团队协作效率?5大路径

一、自动化办公效率工具的应用现状 随着信息技术的飞速发展,自动化办公效率工具在企业中的应用越来越广泛。这些工具通过集成多种功能,帮助企业优化工作流程、提高工作效率、降低运营成本。目前,自动化办公效率工具的应用现状主要体现在以下几个方面:(一)工作流程的自动化…

GPIO

GPIO的八大工作模式区别,如何控制GPIOGPIO 1. 基本定义和概念 IO复用:同一个IO引脚具备多个不同的功能; IO重映射:当出现功能引脚冲突时,讲功能移动到到备用引脚上; 通用和复用的区别:通用表示直接控制,复用表示其他功能模块托管(片上外设)使用; 通用输入输出(GPIO…

“数据飞轮” 理念焕新,助力 2025 企业数智化发展

2024 年,全球科技领域在人工智能浪潮的席卷下加速前行,数字化转型进程也随之踏入全新阶段。在这一背景下,数据飞轮理念延续“以数据消费促资产建设,以数据消费助业务发展”的核心内涵,实现焕新升级。在2025年,升级后的数据飞轮 2.0,将 AI 视作数智化的核心竞争力,借助 …

电桥测量模块24位采样、 带有激励源动态补偿 高精度 适用比例电桥、 固定电桥 可选恒压驱动、 恒流驱动

电桥测量模块24位采样、 带有激励源动态补偿 高精度 适用比例电桥、 固定电桥 可选恒压驱动、 恒流驱动BRGxxx系列模块是一款专为惠斯通电桥测量而设计的高分辨率产品。采用24位ADC同步测量激励源与电桥输出,可提供1~128倍放大增益。该模块支持恒压和恒流两种驱动方案,适用于…

【每日一题】20250114

人经常推翻自己,经常不同意昨天的自己,这也是常态。【每日一题】 1.(18分) \(\hspace{0.7cm}\)I. 为了测量某一弹簧的劲度系数,将该弹簧竖直悬挂起来,在自由端挂上不同质量的砝码.实验测出了砝码质量 \(m\) 与弹簧长度 \(l\) 的相应数据,其对应点已在图上标出.(\(g=9…

新合新公有云环境下载客户端和BOS

公有云下载BOS直接是云IDEBOS和客户端的组件都进行了更新,但是版本号没有变化,应该是修复了bug,融合了临时补丁。 客户端

用于决策的世界模型 -- 论文 World Models (2018) PlaNet (2019) 讲解

介绍了两篇世界模型的文章 World Models (2018) 和 Learning Latent Dynamics for Planning from Pixels (2019),主要侧重点是世界模型在决策和规划中的应用。参考资料:[2411.14499] Understanding World or Predicting Future? A Comprehensive Survey of World Models [18…

AI驱动的CMS:从内容创作到推荐,智能化的变革

一、AI与CMS的结合:为什么是未来内容管理的趋势?CMS的传统局限性传统CMS为网站和企业提供了一个结构化的平台,帮助组织发布和管理内容。然而,传统的CMS系统依赖于人工的内容创作、发布、更新和优化,往往存在以下问题: 内容过度依赖人工:内容创作需要大量人工输入,难以实…