HarmonyOS 鸿蒙Next中系统主题商店中的百变卡片,可以同步系统音乐软件的播放内容及播放状态,这个如何实现

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

【问题现象】:

cke_10749.png

cke_13144.png

cke_14852.png

【版本信息】:API20及以上

【复现代码】:不涉及

【尝试解决方案】:不涉及


更多关于HarmonyOS 鸿蒙Next中系统主题商店中的百变卡片,可以同步系统音乐软件的播放内容及播放状态,这个如何实现的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

【解决方案】

楼主您好,可以参考官方示例代码:基于Form Kit实现音乐服务卡片。点击“音乐播控”卡片上的播放/暂停、上一曲、下一曲,可以控制音乐的播放。

实现说明

  1. 通过formProvider的updateForm()方法实现卡片的主动更新,例如更新歌曲信息、歌词信息等。
  2. 音乐播控卡片、动态歌词卡片的播控功能均通过postCardAction()发送call事件控制应用音乐播放,具体可以参考:通过router或call事件刷新卡片内容
  3. 在EntryFormAbility的onAddForm()实现卡片基本信息的数据持久化,使用关系型数据库来实现。
  4. 音乐卡片通过postCardAction())发送router事件实现跳转应用页面,心动歌词和歌单推荐通过FormLink组件实现跳转应用页面。
  5. 在卡片配置文件中form_config配置scheduledUpdateTime和updateDuration参数,并且设置updateEnabled为true,使能定时和定点刷新。在EntryFormAbility的onUpdateForm()中实现卡片的定时和定点刷新逻辑。
  6. 使用@ohos.effectKit模块的ColorPicker的getMainColor()方法获取歌曲封面图像主色,来设置卡片背景色。
  7. 音频播放通过AVPlayer来实现,具体可以参考:使用AVPlayer播放音频(ArkTS)
  8. 互动卡片通过UIExtensionAbility渲染UI,实现溢出卡片动效效果。

更多关于HarmonyOS 鸿蒙Next中系统主题商店中的百变卡片,可以同步系统音乐软件的播放内容及播放状态,这个如何实现的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


音乐服务卡片这个我知道,这个是播放自己应用内的音乐吧,我想问的是,有没有接口支持获取系统音乐软件的播放状态,比如我在音乐卡片点击了播放,会直接播放系统音乐软件的歌曲,点击暂停,系统音乐也会暂停,我看目前这个百变卡片是可以做到的,想问下三方应用可以实现一样的效果吗,

鸿蒙Next百变卡片通过原子化服务实现音乐同步。卡片使用FormKit组件开发,系统提供媒体会话管理框架(AVSessionKit)获取播放状态。音乐应用需注册为媒体会话提供方,卡片通过AVSessionManager订阅播放状态变更。数据同步使用分布式数据管理(DistributedDataManager)跨设备同步播放信息。

在HarmonyOS Next中,您自己的应用要实现百变卡片同步系统音乐播放内容及状态,可以通过媒体会话管理服务来实现。

核心接口是 avSessionManager,它允许应用访问和管理系统的媒体会话。以下是关键步骤:

  1. 获取媒体会话列表:使用 avSessionManager.getAllSessionDescriptors() 获取当前系统所有活跃的媒体会话描述符。
  2. 监听会话变化:通过 avSessionManager.on('sessionCreate')avSessionManager.on('sessionDestroy') 监听会话的创建与销毁,动态更新卡片数据。
  3. 订阅播放信息:针对目标音乐应用的会话描述符,创建 AVSessionController 控制器,并通过 controller.on('metadataChange')controller.on('playbackStateChange') 监听元数据(如歌曲名、歌手、专辑)和播放状态(播放、暂停、停止)的变化。
  4. 在卡片中展示:在卡片的 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() 实现。
  • 需处理多音乐应用共存时的会话选择逻辑。

通过以上方式,您的应用卡片即可实时同步显示系统音乐播放器的内容与状态。

回到顶部