HarmonyOS鸿蒙Next中求问怎么离线获取到当前播控中心在播放的音乐信息

HarmonyOS鸿蒙Next中求问怎么离线获取到当前播控中心在播放的音乐信息 我想离线获取到当前播控中心播放的音乐信息,求问有什么实现方式

8 回复

开发者您好,当前应用仅可以访问应用自己创建的AVSession,设置或获取应用自己创建的AVSession的会话元数据信息、会话播放状态,和注册播控命令事件监听响应用户通过媒体会话控制方下发的控制命令,可参考官网文档:AVSession Kit简介媒体会话提供方

应用若需自定义卡片,实现播控卡片开发,可参考官网文档:音乐播控卡片

主题中百变卡片开发工具,可参考:Theme Studio百变卡片设计指导及规范

您提到的播控功能的百变卡片,获取AVSession会话信息调用的是系统接口。

请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在哪一个环节遇到了问题?方便说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。

更多关于HarmonyOS鸿蒙Next中求问怎么离线获取到当前播控中心在播放的音乐信息的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


现在是有个想法,在做Demo的过程中,发现无法获取播控中心的音乐信息。本来是想基于用户当前在听的音乐做一些各大音乐APP没做的交互延伸,例如音乐APP播放器样式中还没有的一些样式等等,当下音乐APP很多,我想的是既然这些音乐APP都会接入播控中心,那是否可以从播控中心中获取当前的音乐信息,并且可以基于播控中心支持的操作进行播控控制,所以就提了这个问题。 其他的实现方式应该都会涉及到和各音乐APP的对接,所以感觉最便捷的方式肯定是调用播控功能的百变卡片一样的系统接口,不知道这个系统接口后续是否会开放?,

没办法获取,播控中心是系统级接口,只能单向写入,不能从里面读出

好吧,谢谢,我是看到主题APP里百变卡片里的音乐小组件可以同步播控中心的音乐信息,所以想着是不是有相关的接口啥的,只是我自己也没找到,

没办法获取哦。

播控中心控制音乐状态

在应用接入播控中心后,用户可以直接通过播控中心修改音频播放状态,如暂停/播放、下一首、切换播放模式、拖动进度条等,应用内的音频信息和状态也会同步显示在播控中心界面上,使得用户与应用的交互更加灵活易用。同时与播控中心交互使用的AVSession还管控着应用的后台播放能力,因此对于音乐类应用一般推荐接入播控中心,具体适用场景可以参考应用接入AVSession场景介绍

应用与播控中心交互的过程如下图所示:

cke_500.png

与其他应用音频冲突

当与其他应用的音频发生冲突,多个音频流同时播放时,系统预设了音频打断策略,对多音频的并发进行管控,只有持有音频焦点的音频流才可以正常播放,避免多个音频流无序并发播放的现象出现。为了维持应用和系统的状态一致性,保证符合用户直觉的交互体验,推荐应用处理音频焦点变化,并在收到音频打断事件(InterruptEvent)时做出相应处理。对于音乐类应用,被各种处理音频焦点变化类型的其他应用音频打断场景和效果如下表所示:

先播应用音频类型 后播应用音频类型 打断效果
音乐 闹钟 后播应用播放时,先播应用暂停播放;后播应用停止播放后,先播应用恢复播放
电话
铃声
VOIP 铃声(全屏呼叫/呼叫页面/横幅呼叫)
VOIP 通话
VOIP MESSAGE(微信语音/畅联)
导航 后播应用播放时,先播应用降低音量持续播放;后播应用停止播放后,先播应用恢复音量继续播放
TextReader控件朗读语音
语音助手类短语音
音乐 后播应用播放时,先播应用停止播放;后播应用停止播放后,先播应用不再恢复播放
视频
游戏 先播、后播应用并发混音播放
系统音效(锁屏/按键)

如表所示,根据应用打断效果主要可以分为四个类型:暂停后恢复、降低音量后恢复、停止后不恢复和并发播放,以下分别对这四类场景给出适配方案:

  1. 暂停后恢复场景 后播音频类型为闹钟/电话/铃声/VOIP音频时,先播音频暂停播放;待后播音频播放完毕后,先播音频恢复播放。应用可以注册焦点事件监听,当此类打断事件发生时,系统会自动暂停先播音频,应用侧会接收到INTERRUPT_HINT_PAUSE事件,此时只需更新播放和UI界面状态为暂停态即可,不需要主动停止音频流。当后播音频结束后,应用接收到INTERRUPT_HINT_RESUME事件,此时系统不会主动继续播放先播音频,应用需主动调用播放方法续播音频流。

  2. 降低音量后恢复场景 当后播应用音频类型为导航/TextReader语音/语音助手类语音播报时,先播音频应降低音量持续播放;后播音频播报结束后,先播音频恢复音量继续播放。注意此类打断事件的音量降低/恢复行为是系统行为,应用无需主动调整音量。在降低音量和恢复时会分别收到INTERRUPT_HINT_DUCK和INTERRUPT_HINT_UNDUCK回调,应用可以在回调中按需更新页面状态或处理其他业务逻辑。

  3. 停止后不恢复场景 当后播应用音频类型为音乐/视频时,音乐终止播放;后播音频停止后,音乐不恢复播放。应用可以注册焦点事件监听,接收到INTERRUPT_HINT_STOP事件时,停止音乐播放,并更新UI界面。

  4. 并发场景

    • 当后播应用音频类型为游戏或系统提示音(锁屏、按键)时,先播音频不停止,与后播音频混音并发播放。此行为是系统默认行为,应用侧不需要适配。
    • 如果是音乐音频于后台播放,前台音视频静音并发播放的场景,则需要前台应用使用setSilentModeAndMixWithOthers接口开启静音并发模式,否则系统会根据音频流类型默认触发对应打断场景。当前台音视频取消静音播放时,setSilentModeAndMixWithOthers()接口关闭静音并发模式,同时使用activateAudioSession激活音频会话(AudioSession)并指定音频会话策略为暂停模式(CONCURRENCY_PAUSE_OTHERS),使后台音频处于暂停模式。当前台音频暂停后,再次开启静音并发模式时,可以使后台音频恢复播放。

好吧,谢谢,我是看到主题APP里百变卡片里的音乐小组件可以同步播控中心的音乐信息,所以想着是不是有相关的接口啥的,只是我自己也没找到,

在HarmonyOS Next中,可通过AVSessionManager获取当前播放的音乐信息。使用getActiveAVSession()获取活跃的AVSession,再通过AVSessionAVMetadata属性获取音乐元数据,如标题、艺术家等。

在HarmonyOS Next中,要离线获取当前播控中心正在播放的音乐信息,核心是使用AVSession(音视频会话)框架。这是系统统一的媒体播放控制与信息获取接口。

主要实现步骤与关键API如下:

  1. 获取AVSessionManager 首先获取会话管理器的实例。

    import avSession from '@ohos.multimedia.avsession';
    let avSessionManager = avSession.getAVSessionManager();
    
  2. 获取当前系统的音频焦点会话 播控中心管理的播放会话通常持有音频焦点。通过getCurrentAVSession方法可以获取到当前具有音频焦点的会话,这通常就是正在播放的媒体应用会话。

    import avSession from '@ohos.multimedia.avsession';
    let session: avSession.AVSession | null = null;
    avSession.getAVSessionManager().getCurrentAVSession(avSession.AVSession.AudioFocusType.ALL).then((currentSession: avSession.AVSession) => {
      session = currentSession;
    }).catch((err: BusinessError) => {
      console.error(`Failed to get current session. Code: ${err.code}, message: ${err.message}`);
    });
    
  3. 获取会话的元数据(AVMetadata) 获取到AVSession对象后,可以通过其AVSessionController来读取详细的元数据,其中就包含音乐信息。

    if (session) {
      let controller: avSession.AVSessionController = await avSessionManager.createController(session.sessionId);
      let avMetadata: avSession.AVMetadata = controller.getAVMetadata();
      // 从avMetadata中提取音乐信息
      let title: string = avMetadata.title; // 歌曲标题
      let artist: string = avMetadata.artist; // 艺术家
      let album: string = avMetadata.album; // 专辑
      let duration: number = avMetadata.duration; // 总时长(毫秒)
      // ... 其他属性如writer, composer等
    }
    
  4. 获取播放状态 同时,可以获取当前的播放状态,如是否正在播放、进度、速度等。

    let avPlaybackState: avSession.AVPlaybackState = controller.getAVPlaybackState();
    let isPlaying: boolean = (avPlaybackState.state === avSession.PlaybackState.PLAYING);
    let currentPosition: number = avPlaybackState.position; // 当前播放位置(毫秒)
    let playbackSpeed: number = avPlaybackState.speed; // 播放速度
    

关键注意事项:

  • 权限声明:在应用的module.json5配置文件中,需要声明ohos.permission.MANAGE_MEDIA_RESOURCES权限。该权限为system_core级别,通常需要特殊申请。
    {
      "module": {
        "requestPermissions": [
          {
            "name": "ohos.permission.MANAGE_MEDIA_RESOURCES",
            "reason": "$string:reason",
            "usedScene": {
              "abilities": [
                "EntryAbility"
              ],
              "when": "always"
            }
          }
        ]
      }
    }
    
  • “离线”含义:此方法获取的是设备本地当前活跃的媒体会话信息,不依赖于网络,符合“离线获取”的要求。
  • 会话有效性:获取到的AVSession对象可能因为播放停止或应用退出而失效,在访问其属性前需做好空值判断。可以监听会话的销毁事件。
  • 后台限制:若应用在后台长时间运行并监听会话变化,需注意系统的后台任务管理策略。

通过上述AVSession框架的接口,你可以稳定地获取到由播控中心统一管理的当前播放音乐的标题、艺人、专辑、播放进度等核心信息。

回到顶部