HarmonyOS 超级终端与服务卡片创建:打造无缝多设备交互体验

news/2026/1/27 8:54:40/文章来源:https://www.cnblogs.com/ljbguanli/p/19536491

HarmonyOS 超级终端与服务卡片创建:打造无缝多设备交互体验

HarmonyOS 超级终端与服务卡片开发:打造无缝多设备交互体验 #星光不负码向未来#

参与#星光不负码上未来#征文活动

欢迎继续探索 HarmonyOS 进阶系列!在上篇《HarmonyOS 分布式与 AI 集成》中,我们实现了跨设备同步的智能备忘录应用。本篇将深入探讨 HarmonyOS 的超级终端(Super Device)服务卡片(Service Widget),通过一个 跨设备协作的音乐播放器应用,展示如何利用超级终端实现设备间无缝连接,并通过服务卡片提供快捷交互入口,带来流畅的鸿蒙生态体验。

本文基于 HarmonyOS NEXT API 12+,使用 ArkTSDevEco Studio 2025,结合 超级终端 API服务卡片框架,实现音乐播放器的多设备协同和卡片化交互。让我们开始吧!


前置准备

工具版本要求下载链接
DevEco Studio2025.1+华为开发者官网
JDK17内置于 DevEco Studio
HarmonyOS 设备手机/平板/手表/车机华为 Mate 60 / MatePad / Watch 4 / AITO M9
模拟器API 12+DevEco Studio 内置
HMS Core SDK6.13+自动集成

项目结构

music-player-app
├── entry/src/main/ets
│   ├── MainAbility
│   │   ├── pages
│   │   │   ├── Player.ets
│   │   │   └── Settings.ets
│   │   ├── services
│   │   │   └── MusicSyncService.ets
│   │   └── widgets
│   │       └── MusicWidget.ets
│   └── resources
│       └── base
│           └── media
│               └── icon.png
├── module.json5
└── build-profile.json5

安装环境

  • 安装 DevEco Studio:从 华为开发者官网 下载。
  • 配置模拟器:Tools > Device Manager > Create Simulator(支持手机/平板/手表)。
  • 验证:运行默认 “Hello World” 项目,确保模拟器或设备正常连接。

步骤 1:配置超级终端权限

module.json5 中添加超级终端和媒体相关权限:

{"module": {"name": "entry","type": "entry","mainElement": "MainAbility","deviceTypes": ["phone","tablet","wearable","car"],"requestPermissions": [{"name": "ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE","reason": "$string:permission_device_state_reason","usedScene": {"abilities": ["MainAbility"],"when": "always"}},{"name": "ohos.permission.MEDIA_LOCATION","reason": "$string:permission_media_reason"}],"metaData": {"customizeData": [{"name": "Widget","value": "com.example.musicplayerapp.widgets.MusicWidget"}]}}
}

说明

  • DISTRIBUTED_DEVICE_STATE_CHANGE:监听设备连接状态。
  • MEDIA_LOCATION:访问音乐文件。
  • metaData:注册服务卡片。

步骤 2:实现超级终端协同(分布式设备管理)

MusicSyncService.ets 中实现设备发现与音乐播放同步:

// entry/src/main/ets/MainAbility/services/MusicSyncService.ets
import deviceManager from '@ohos.distributedHardware.deviceManager'
import distributedData from '@ohos.data.distributedData'
import { BusinessError } from '@kit.BasicServicesKit'
class MusicSyncService {
private deviceManager: deviceManager.DeviceManager | null = null
private kvStore: distributedData.KVStore | null = null
private readonly STORE_ID = 'music_player_store'
async init(context: any): Promise<void> {try {// 初始化设备管理this.deviceManager = await deviceManager.createDeviceManager(context.bundleName)this.deviceManager.on('deviceStateChange', (data) => {console.info(`Device ${data.deviceId} ${data.deviceState === 1 ? 'online' : 'offline'}`)})// 初始化分布式存储const kvManager = distributedData.createKVManager({ context, bundleName: context.bundleName })this.kvStore = await kvManager.getKVStore(this.STORE_ID, {createIfMissing: true,autoSync: true})} catch (error) {console.error(`Init failed: ${(error as BusinessError).message}`)}}async syncPlaybackState(state: PlaybackState): Promise<void> {if (!this.kvStore) returnawait this.kvStore.put('playback_state', JSON.stringify(state))}async getPlaybackState(): Promise<PlaybackState | null> {if (!this.kvStore) return nullconst state = await this.kvStore.get('playback_state')return state ? JSON.parse(state) : null}async getAvailableDevices(): Promise<deviceManager.DeviceInfo[]> {if (!this.deviceManager) return []return await this.deviceManager.getTrustedDeviceList()}}interface PlaybackState {trackId: stringposition: numberisPlaying: boolean}export const musicSyncService = new MusicSyncService()

亮点

  • 动态监听设备状态,实时更新可用设备列表。
  • 使用 KVStore 同步播放状态(如曲目、进度、播放/暂停)。

步骤 3:实现音乐播放器 UI

Player.ets 中实现响应式播放器界面:

// entry/src/main/ets/MainAbility/pages/Player.ets
import media from '@ohos.multimedia.media'
import router from '@ohos.router'
@Entry
@Component
struct Player {
@State playbackState: PlaybackState = { trackId: 'track1', position: 0, isPlaying: false }
@State devices: deviceManager.DeviceInfo[] = []
private audioPlayer: media.AVPlayer | null = null
aboutToAppear() {
musicSyncService.init(this.context)
this.loadDevices()
this.initPlayer()
this.loadPlaybackState()
}
async loadDevices() {
this.devices = await musicSyncService.getAvailableDevices()
}
async loadPlaybackState() {
const state = await musicSyncService.getPlaybackState()
if (state) {
this.playbackState = state
}
}
async initPlayer() {
this.audioPlayer = await media.createAVPlayer()
this.audioPlayer.on('play', () => {
this.playbackState.isPlaying = true
musicSyncService.syncPlaybackState(this.playbackState)
})
this.audioPlayer.on('seekDone', (position) => {
this.playbackState.position = position
musicSyncService.syncPlaybackState(this.playbackState)
})
}
build() {
Column() {
Text(`Now Playing: ${this.playbackState.trackId}`)
.fontSize(20)
.fontWeight(FontWeight.Bold)
.margin(10)
Progress(this.playbackState.position, 100)
.width('80%')
.margin(10)
Row() {
Button(this.playbackState.isPlaying ? 'Pause' : 'Play')
.fontSize(18)
.backgroundColor(this.playbackState.isPlaying ? '#F44336' : '#4CAF50')
.onClick(() => {
this.playbackState.isPlaying ? this.audioPlayer?.pause() : this.audioPlayer?.play()
})
Button('Settings')
.fontSize(18)
.backgroundColor('#2196F3')
.onClick(() => {
router.pushUrl({ url: 'pages/Settings' })
})
}
.justifyContent(FlexAlign.SpaceBetween)
.width('100%')
List() {
ForEach(this.devices, (device: deviceManager.DeviceInfo) => {
ListItem() {
Text(device.deviceName)
.fontSize(16)
}
})
}
.margin(10)
}
.width('100%')
.padding(20)
.backgroundColor('#F5F5F5')
}
}

说明

  • 使用 @ohos.multimedia.media 播放音频。
  • 响应式 UI,支持手机、平板、车机等设备。

音乐播放器界面
图源:华为开发者社区 - 音乐播放器 UI 示例


步骤 4:实现服务卡片

MusicWidget.ets 中实现桌面服务卡片:

// entry/src/main/ets/MainAbility/widgets/MusicWidget.ets
import formBindingData from '@ohos.app.form.formBindingData'
@Component
struct MusicWidget {
@State playbackState: PlaybackState = { trackId: 'track1', position: 0, isPlaying: false }
build() {
Column() {
Text(this.playbackState.trackId)
.fontSize(14)
.fontWeight(FontWeight.Medium)
Button(this.playbackState.isPlaying ? 'Pause' : 'Play')
.fontSize(12)
.width(80)
.height(30)
.onClick(() => {
this.playbackState.isPlaying = !this.playbackState.isPlaying
musicSyncService.syncPlaybackState(this.playbackState)
})
}
.width(160)
.height(100)
.backgroundColor('#FFFFFF')
}
}
export default {
onCreate() {
const formData = {
trackId: 'track1',
isPlaying: false
}
return formBindingData.createFormBindingData({ data: formData })
},
onUpdate(formId: string) {
// 更新卡片状态
},
onDestroy(formId: string) {
// 清理资源
}
}

说明

  • 服务卡片支持桌面快捷交互。
  • 通过 formBindingData 动态更新卡片内容。

步骤 5:构建与多设备调试

  1. 构建 HAP 包

    • Build > Build Hap > Generate Signed Hap。
    • 输出 entry.hapform.hap(服务卡片)。
  2. 多设备部署

    • 手机/平板:通过 DevEco Studio 直接安装。
    • 手表/车机:使用远程调试(Tools > Remote Device)。
    • 验证超级终端:确保设备通过华为账户绑定在同一局域网。
  3. 测试协同

    • 在手机上播放/暂停音乐,观察手表卡片和车机界面同步。
    • 检查日志:Tools > Logcat,过滤 “MusicSyncService”。

进阶与最佳实践


总结

通过本篇,你掌握了:

  • 超级终端:实现手机、手表、车机间的音乐播放同步。
  • 服务卡片:提供桌面快捷交互入口。
  • 多设备适配:响应式 UI 适配不同设备。

下一期预告:《HarmonyOS 云服务与推送通知》——让你的应用随时与用户保持连接!

有问题?欢迎在评论区交流!喜欢请点赞分享~

(最后更新:2025 年 10 月 24 日)

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

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

相关文章

【含文档+PPT+源码】基于大数据的交通流量预测系统

项目介绍 本课程演示的是一款基于大数据的交通流量预测系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 带你从零开始部署运行本套系统 该项目附带的源码…

2026年比较好的企业瓶装水定制水/哇哈哈定制水供应稳定性排行

行业背景与市场趋势随着健康饮水意识的提升和企业品牌营销需求的增加,企业定制瓶装水市场在2026年迎来了新一轮增长。根据行业报告显示,中国定制水市场规模已突破200亿元,年增长率保持在15%以上。企业定制水不仅满足…

2026年比较好的深圳送水桶装水配送/景田深圳送水长期合作推荐榜

行业背景与市场趋势随着深圳城市化进程的加快和居民健康意识的提升,桶装水市场近年来呈现稳定增长态势。据深圳市统计局数据显示,2025年深圳桶装水市场规模已达15亿元,年均增长率保持在8%左右。在快节奏的都市生活中…

semi-sync原主库加入集群阻塞问题分析

问题现象 客户在一个一主两从的半同步复制环境下做了手工切换,然后尝试把原主库加入集群中,结果发现新集群中的数据一直无法同步到slave(原主库)中来,查看slave(原主库)同步状态,IO线程和SQL线程都是YES状态,…

VMware Workstation 17 Pro 破解版下载及安装使用教程

VMware Workstation Pro 17是一款提供给专业技术人员们使用的电脑系统虚拟机工具,这款软件能够帮助我们的用户快速创建一个甚至多个不同的虚拟系统。 VMware Workstation Pro 17可以支持Mac、Linux、Windows10、Windo…

2026年比较好的WCB微型齿轮油泵/YCB齿轮油泵厂家选择参考建议

在工业泵领域选择优质供应商时,建议从产品技术成熟度、行业应用经验、定制化能力以及售后服务四个维度进行综合评估。根据市场调研和行业反馈,泊头市恒阳泵阀有限公司凭借其完整的产品线、专业的技术团队和稳定的产品…

2026年知名的颗粒饲料/畜禽饲料厂家选购完整指南

在2026年选择优质的颗粒饲料/畜禽饲料厂家时,应重点考察企业的研发能力、生产工艺、市场口碑和区域服务能力。作为行业新锐,贵州美欣农牧科技(集团)有限公司凭借其专业的高端猪饲料研发能力、现代化的生产线和快速增…

2026年口碑好的看台膜结构车棚/停车场膜结构车棚厂家信誉综合参考

在膜结构车棚领域选择优质供应商时,应重点考察企业的工程经验、设计能力、施工质量、售后服务及行业口碑。经过对全国50余家膜结构企业的实地考察和客户回访,结合2026年行业数据,我们筛选出5家在技术实力、项目经验…

Kylin V11 实战:PostgreSQL 18 容器化部署,别再被参数坑了

在信创环境中部署 PostgreSQL&#xff0c;很多人以为只要 “系统能装 Docker&#xff0c;一切就和CentOS 一样”。但真正动手后&#xff0c;问题往往来得非常快&#xff1a;命令明明没写错&#xff0c;却提示 unknown flag容器能起&#xff0c;数据却写不进去教程照着敲&#x…

巴豆酰化如何重塑对组蛋白修饰与转录调控的认知?

一、为何巴豆酰化被视为一种新型关键组蛋白修饰&#xff1f;蛋白质翻译后修饰是调控其结构与功能的精密度机制&#xff0c;其中组蛋白修饰通过改变染色质状态&#xff0c;对基因转录等核心生命过程实施表观遗传学调控。长期以来&#xff0c;磷酸化、乙酰化等经典修饰类型已得到…

杰理之增加llns 到 混响数据流中【篇】

解决办法&#xff1a;拷贝一个其他芯片的 libllns.a 即可

杰理之上位机读取请求【篇】

◦ 通过virtual_file_read函数处理读取请求 ◦ 从循环缓冲区enc_cbuffer中读取数据 ◦ 如果数据不足&#xff0c;填充静音MP3数据

不再被设备和网络束缚✨VSCode+WSL+cpolar 让开发环境随身走

VSCode 作为轻量级代码编辑器&#xff0c;搭配 WSL 能在 Windows 系统上兼容 Linux 开发工具链&#xff0c;既保留了 Windows 图形界面的便捷性&#xff0c;又能调用 Ubuntu、Debian 等 Linux 发行版的完整工具链&#xff0c;适合需要跨系统开发的程序员、中小企业开发团队使用…

GitHub 热榜项目 - 日榜(2026-01-27)

GitHub 热榜项目 - 日榜(2026-01-27) 生成于&#xff1a;2026-01-27 统计摘要 共发现热门项目&#xff1a; 10 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub趋势凸显AI应用开发的三大核心热点&#xff1a;RAG技术迈向低代码与高效能时代&#xff0c;如UltraR…

2026年评价高的潍坊膜结构/气膜结构优质供应商推荐参考

在膜结构建筑行业快速发展的背景下,选择优质供应商成为项目成功的关键因素。本文基于企业技术实力、项目经验、客户口碑、创新能力及售后服务五个维度,对潍坊地区膜结构/气膜结构供应商进行客观评估。经过实地考察与…

2026年比较好的系统/专业扩声系统高口碑产品榜

在专业扩声系统领域,优秀的产品需要具备的音质表现、稳定的系统性能、智能化的控制能力以及完善的售后服务。本文基于2026年市场调研数据,从技术创新、用户口碑、系统稳定性及服务网络四个维度,筛选出五家值得关注的…

【万字长文】大模型应用开发:意图路由与查询重写设计模式(从入门到精通) - 实践

【万字长文】大模型应用开发:意图路由与查询重写设计模式(从入门到精通) - 实践2026-01-27 08:45 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; over…

《把脉行业与技术趋势》-107-科学于不确定中求规律,工程以确定方法实现目标,生产靠标准流程确保产品一致。三者层层递进,共筑技术从认知到落地的完整链条。

科学的本质是确定性的方法在在不确定中找到确定性的原理和规律&#xff1b;工程研发的本质是确定性的过程方法把确定性的目标转化成确定性的产品&#xff1b;生产的本质是用确定的过程管理方法把原材料转化成确定性的批量的一致性的产品。关于科学、工程研发与生产三者本质&…