HarmonyOS 鸿蒙Next中系统主题商店中的百变卡片,可以同步系统音乐软件的播放内容及播放状态,这个如何实现
HarmonyOS 鸿蒙Next中系统主题商店中的百变卡片,可以同步系统音乐软件的播放内容及播放状态,这个如何实现 【问题描述】:浏览系统主题商店中的百变卡片时,发了一些音乐类的卡片,添加到桌面后,可以同步获取系统音乐软件的播放内容,以及播放状态,请问我自己开发的应用是否可以实现该效果,通过什么接口获取数据
【问题现象】:



【版本信息】:API20及以上
【复现代码】:不涉及
【尝试解决方案】:不涉及
更多关于HarmonyOS 鸿蒙Next中系统主题商店中的百变卡片,可以同步系统音乐软件的播放内容及播放状态,这个如何实现的实战教程也可以访问 https://www.itying.com/category-93-b0.html
【解决方案】
楼主您好,可以参考官方示例代码:基于Form Kit实现音乐服务卡片。点击“音乐播控”卡片上的播放/暂停、上一曲、下一曲,可以控制音乐的播放。
实现说明
- 通过formProvider的updateForm()方法实现卡片的主动更新,例如更新歌曲信息、歌词信息等。
- 音乐播控卡片、动态歌词卡片的播控功能均通过postCardAction()发送call事件控制应用音乐播放,具体可以参考:通过router或call事件刷新卡片内容。
- 在EntryFormAbility的onAddForm()实现卡片基本信息的数据持久化,使用关系型数据库来实现。
- 音乐卡片通过postCardAction())发送router事件实现跳转应用页面,心动歌词和歌单推荐通过FormLink组件实现跳转应用页面。
- 在卡片配置文件中form_config配置scheduledUpdateTime和updateDuration参数,并且设置updateEnabled为true,使能定时和定点刷新。在EntryFormAbility的onUpdateForm()中实现卡片的定时和定点刷新逻辑。
- 使用@ohos.effectKit模块的ColorPicker的getMainColor()方法获取歌曲封面图像主色,来设置卡片背景色。
- 音频播放通过AVPlayer来实现,具体可以参考:使用AVPlayer播放音频(ArkTS)。
- 互动卡片通过UIExtensionAbility渲染UI,实现溢出卡片动效效果。
更多关于HarmonyOS 鸿蒙Next中系统主题商店中的百变卡片,可以同步系统音乐软件的播放内容及播放状态,这个如何实现的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
音乐服务卡片这个我知道,这个是播放自己应用内的音乐吧,我想问的是,有没有接口支持获取系统音乐软件的播放状态,比如我在音乐卡片点击了播放,会直接播放系统音乐软件的歌曲,点击暂停,系统音乐也会暂停,我看目前这个百变卡片是可以做到的,想问下三方应用可以实现一样的效果吗,
鸿蒙Next百变卡片通过原子化服务实现音乐同步。卡片使用FormKit组件开发,系统提供媒体会话管理框架(AVSessionKit)获取播放状态。音乐应用需注册为媒体会话提供方,卡片通过AVSessionManager订阅播放状态变更。数据同步使用分布式数据管理(DistributedDataManager)跨设备同步播放信息。
在HarmonyOS Next中,您自己的应用要实现百变卡片同步系统音乐播放内容及状态,可以通过媒体会话管理服务来实现。
核心接口是 avSessionManager,它允许应用访问和管理系统的媒体会话。以下是关键步骤:
- 获取媒体会话列表:使用
avSessionManager.getAllSessionDescriptors()获取当前系统所有活跃的媒体会话描述符。 - 监听会话变化:通过
avSessionManager.on('sessionCreate')和avSessionManager.on('sessionDestroy')监听会话的创建与销毁,动态更新卡片数据。 - 订阅播放信息:针对目标音乐应用的会话描述符,创建
AVSessionController控制器,并通过controller.on('metadataChange')和controller.on('playbackStateChange')监听元数据(如歌曲名、歌手、专辑)和播放状态(播放、暂停、停止)的变化。 - 在卡片中展示:在卡片的
FormExtensionAbility中实现上述监听逻辑,当数据变化时,调用formProvider.updateForm()更新卡片UI。
关键代码示例(ArkTS):
import avSession from '@ohos.multimedia.avsession';
import formProvider from '@ohos.app.form.formProvider';
// 1. 获取会话管理器
let avSessionManager = avSession.getAVSessionManager();
// 2. 获取所有会话并筛选音乐应用会话
let sessionDescriptors = await avSessionManager.getAllSessionDescriptors();
let musicSessionDescriptor = sessionDescriptors.find(desc => desc.type === avSession.AVSessionType.AUDIO);
if (musicSessionDescriptor) {
// 3. 创建控制器并订阅变化
let controller = await avSessionManager.createController(musicSessionDescriptor.sessionId);
controller.on('metadataChange', (metadata) => {
// 更新卡片歌曲信息
let songName = metadata.assetTitle;
let artist = metadata.artist;
// ... 更新卡片UI
});
controller.on('playbackStateChange', (state) => {
// 更新卡片播放状态
let isPlaying = (state.state === avSession.PlaybackState.PLAYBACK_STATE_PLAY);
// ... 更新卡片UI
});
}
注意事项:
- 需要在
module.json5中申请ohos.permission.MANAGE_MEDIA_RESOURCES权限。 - 卡片仅能展示信息,如需控制播放(如切歌、暂停),需通过
AVSessionController调用sendControlCommand()实现。 - 需处理多音乐应用共存时的会话选择逻辑。
通过以上方式,您的应用卡片即可实时同步显示系统音乐播放器的内容与状态。

