HarmonyOS 鸿蒙Next中如何实现后台音频播放卡片

HarmonyOS 鸿蒙Next中如何实现后台音频播放卡片 图片图片

如何在音频播放过程中主页面切到桌面实现如上左图效果,并且在点击后展现右图,并且点击有图标题返回应用的播放页面


更多关于HarmonyOS 鸿蒙Next中如何实现后台音频播放卡片的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

实现后台音频播放卡片可以参考音乐服务卡片demo

示例中音乐播放功能使用AVPlayer,具体实现可以参考使用AVPlayer播放音频(ArkTS)

为保证音乐能在后台播放或熄屏播放,需要接入AVSession(媒体会话)申请长时任务,避免播放被系统强制中断。

音视频应用接入媒体会话(AVSession),并在播控中心显示分为如下几个步骤:

  1. 确定应用需要创建的会话类型,创建对应的会话,不同类型决定了播控中心展示的控制模板样式。
  2. 按需创建后台任务
  3. 设置必要的元数据(Metadata),以在播控中心展示相应的信息,包括不限于:当前媒体的ID(assetId),上一首媒体的ID(previousAssetId),下一首媒体的ID(nextAssetId),标题(title),专辑作者(author),专辑名称(album),词作者(writer),媒体时长(duration)等属性。
  4. 设置播放相关的状态,包括不限于:当前媒体的播放状态(state)、播放位置(position)、播放倍速(speed)、缓冲时间(bufferedTime)、循环模式(loopMode)、是否收藏(isFavorite)、正在播放的媒体Id(activeItemId)、自定义媒体数据(extras)等属性。
  5. 按需注册不同的控制命令,包括不限于:播放/暂停、上下一首、快进快退、收藏、循环模式、进度条。
  6. 应用退出或者无对应业务时,注销会话。

【背景知识】

  • AVSession Kit提供音频后台约束能力,应用接入AVSession(媒体会话)后,可以进行后台音频播放。通过系统播控中心,应用后台播放可见可控,音视频应用可统一控制。此功能需要同时申请后台任务。
  • 音乐服务卡片示例
  • 长时任务应用退至后台后,在后台需要长时间运行用户可感知的任务,如播放音乐、导航等。为防止应用进程被挂起,导致对应功能异常,可以申请长时任务,使应用在后台长时间运行

更多关于HarmonyOS 鸿蒙Next中如何实现后台音频播放卡片的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


1. 实现后台音频播放能力

  • 接入 AVSession(媒体会话): 这是系统管控后台播放的基础。应用需创建并激活 AVSession,用于与系统播控中心交互。
  • 在音频播放前创建 AVSession 会话(类型设为 audio ),设置元数据(如歌曲标题、歌手、封面),并注册控制命令(播放/暂停等)。
  • 代码示例:
// 创建并激活 AVSession
let session = await avSession.createAVSession(context, 'SESSION_NAME', 'audio');
await session.activate();
session.setAVMetadata(metadata); // 设置歌曲信息
  • 申请长时任务(Background Task): 防止应用在后台被挂起,确保音频持续播放。
  • module.json5 中声明权限 ohos.permission.KEEP_BACKGROUND_RUNNING 和后台模式 audioPlayback 。
  • 播放时调用 startBackgroundRunning() 申请任务,暂停时调用 stopBackgroundRunning() 取消。

2. 开发音乐播控卡片(动态卡片)

  • 卡片类型选择: 由于音乐卡片需要复杂播控逻辑(播放/暂停、收藏等),文档推荐使用 动态卡片(ArkTS 卡片),支持事件处理和自定义动效。
  • 卡片 UI 布局
  • 创建 2x2 和 2x4 两种规格的卡片布局,使用 RelativeContainer 减少性能开销。
  • 绑定变量(如播放状态 isPlay 、收藏状态 isCollected ),通过 @LocalStorageProp 接收应用侧数据。
  • 卡片数据初始化
  • 用户长按应用图标添加卡片时,在 FormExtensionAbility 的 onAddForm() 回调中初始化数据,使卡片预览与应用当前播放状态一致。
  • 卡片播控功能
  • 通过 postCardAction 发送 call 事件 到应用主进程(UIAbility),触发播放/暂停等操作。
// 卡片侧发送 call 事件
ActionUtils.playByAction(this, PlayActionType.PLAY, this.formId);

// 应用主进程(UIAbility)订阅并处理事件
this.callee.on('playByActionCall', this.playByActionCall);

3. 实现卡片与应用的交互效果

  • 主页面切到桌面时显示卡片
  • 当应用退到后台,卡片会显示在桌面(如文档中图7、图9效果)。卡片数据通过 AVSession 和长时任务保持同步,实时反映播放状态(如歌曲信息、播放进度)。
  • 点击卡片非控区域拉起应用播放页面
  • 在卡片布局最外层绑定 onClick 事件,通过 router 事件 拉起应用主进程的 EntryAbility。
// 卡片侧发送 router 事件
ActionUtils.jumpPlayPage(this); // 触发拉起应用

// EntryAbility 中处理路由事件,跳转到播放页面
if (type === RouterType.PLAYER) {
  AppStorage.setOrCreate('isShowPlay', true); // 控制播放页面弹窗显示
}
  • 播放页面通过 bindContentCover 以弹窗形式展示,由 isShowPlay 状态控制。
  • 点击卡片标题返回应用播放页面
  • 同上,通过 router 事件实现。卡片标题区域绑定点击事件,跳转到应用内指定页面(如播放详情页)。

注意事项

  • 权限和配置
  • module.json5 中正确声明后台权限和 audioPlayback 模式。
  • 卡片更新需通过 formProvider.updateForm() 依据 formId 批量处理。
  • 状态同步
  • 应用播放状态变化时,需通过 FormUtils.updateMusicControlCards() 更新所有相关卡片,确保数据一致性。

参考 Demo

AVSession管控媒体播放。当第三方应用从前台切换到后台或进入锁屏状态时,媒体播放会强制暂停,且应用不会感知。若需开发后台播放功能,应在后台任务管理中启动长时任务播放音乐,并接入AVSession能力,允许控制中心的播控面板控制第三方应用的播放功能。

后台播放功能介绍: 

实际应用中,大多数音视频都有后台播放的需求,本指南将详细讲解如何实现后台长时间播放的方法。

基本概念

开始之前,开发者应了解以下基本概念,以便根据自身播放器的类型,更有效地实现后台播放。

  • 长时任务:请参考长时任务(ArkTS)说明。

    设备返回主界面、锁屏、应用切换等操作会使应用退至后台。当应用退至后台时,再继续活动,可能会出现设备耗电快、用户界面卡顿等问题。为了降低设备耗电速度、保障用户使用流畅度,系统会对退至后台的应用进行管控,包括进程挂起和进程终止。

    当应用退至后台并需要长时间运行用户可感知的任务(如播放音乐、播放视频等)时,为防止应用进程被挂起,导致对应功能异常,可以申请长时任务,使应用在后台长时间运行。

  • AVSession:请参考AVSession Kit简介

    AVSession Kit(音视频播控服务)是系统提供的音视频管控服务,用于统一管理系统中音视频行为,帮助开发者快速构建音视频统一展示和控制能力。音视频类应用接入AVSession后,可以设置应用的数据(如正在播放的歌曲、歌曲的播放状态等)。用户可以通过系统播控中心来展示和控制不同应用的播放。AVSession会对后台的媒体播放有约束行为,所以通常来说,音频应用、听书类应用、视频应用等都需要接入AVSession。如果应用在没有创建AVSession的情况进行上述业务,系统会在检测到应用退至后台时,停止对应的音视频播放,以达到约束应用行为的目的。

  • AVPlayer:参考AVPlayer说明。

    AVPlayer是一款功能强大的媒体播放器。使用AVPlayer可以实现端到端地播放多种音视频格式(如mp4、mp3、mkv、mpeg-ts等),开发者提供媒体源即可启动播放,无需关注复杂的解封装、解码处理。

  • AudioRenderer:请参考使用AudioRenderer开发音频播放功能说明。

    AudioRenderer是音频渲染器,用于播放PCM(Pulse Code Modulation)音频数据。相比AVPlayer而言,AudioRenderer可以在输入前添加数据预处理,更适合有音频开发经验的开发者,以实现更灵活的播放功能。

应用接入规范

  • 当应用需要在后台播放媒体类型(流类型为STREAM_USAGE_MUSIC、STREAM_USAGE_MOVIE和STREAM_USAGE_AUDIOBOOK)和游戏类型(流类型为STREAM_USAGE_GAME)时,必须接入AVSession和申请长时任务。流类型请参考使用合适的音频流类型,长时任务支持的类型请参考BackgroundMode

  • 除了上述播放类型,针对用户可感知的其他播放任务,如果应用需要在后台长时间运行该任务,必须申请AUDIO_PLAYBACK类型长时任务。

如果应用不满足上述接入规范,退至后台播放时会被系统静音并冻结,无法在后台正常播放。直到应用重新切回前台时,才会被解除静音并恢复播放。

开发步骤

音视频应用进行后台播放的基本步骤如下所示。

启动播放器

应用播放可以通过AudioRenderer、AVPlayer、其他第三方或自研的播放器来播放音视频。

  • AudioRenderer:使用AudioRenderer创建播放音频流时应该注意使用合适的音频流类型。流类型的不同对音量控制、音频焦点管理以及输入/输出设备都具有决定性影响。详细内容请参考使用合适的音频流类型

    同时需要注意正确处理音频焦点,系统预设了默认的音频焦点策略,根据音频流的类型及启动的先后顺序,对所有播放和录制音频流进行统一管理。在应用播放或录制音频的过程中,若有其他音频流申请焦点,系统会根据焦点策略进行焦点处理。若判定本音频流的焦点有变化,系统会自动执行一些必要操作(如暂停、继续、降低音量、恢复音量等),并通过音频焦点事件(InterruptEvent)通知应用。详细内容请参考处理音频焦点变化

    开发指导请参考使用AudioRenderer开发音频播放功能

  • AVPlayer:使用AVPlayer可以实现端到端播放原始媒体资源。如果要实现后台播放或熄屏播放,需要接入AVSession和申请长时任务,避免播放被系统强制中断。AVPlayer可通过audioInterruptMode属性设置焦点管理策略,该策略默认使用SHARE_MODE共享焦点模式。

    开发指导请参考使用AVPlayer播放音频(ArkTS)

接入AVSession

当创建的音频流类型为STREAM_USAGE_MUSIC、STREAM_USAGE_MOVIE、STREAM_USAGE_AUDIOBOOK或STREAM_USAGE_GAME时,无论是将应用退至后台继续播放,还是在后台启动播放,都必须接入AVSession。

关于AVSession的创建和释放时机,建议在应用启动或开始播放业务之前进行创建,并在应用进程结束或完全退出播放业务且不再播放时予以释放,以避免频繁创建和释放AVSession,从而保证应用播放业务的连续性和稳定性。应用后台播放时,需要确保AVSession对象实例在应用后台活动期间一直存在,避免被系统回收、释放,比如不要使用局部变量保存AVSession对象等。

创建AVSession后,为了保证接入体验,要求设置以下元数据并注册以下控制命令。

  • 元数据:标题、副标题/歌手、封面图。具体操作请参考设置元数据
  • 注册控制命令:播放/暂停。具体操作请参考注册控制命令

AVSession的接入开发请参考指南应用接入AVSession场景介绍

申请长时任务

在长时任务中可以申请多种类型的任务。例如:当后台播音的任务类型为AUDIO_PLAYBACK时,应用在后台播放音频、视频或通过AVSession投播组件投播,都可申请类型为AUDIO_PLAYBACK的长时任务。

  • 播放时申请长时任务,如果应用明确有后台播放业务(例如:视频应用开启后台放音选项),可以在前台播放时申请长时任务。
  • 暂停或停止时主动取消长时任务。(例如:用户主动点击音乐暂停播放时,应用需及时取消对应的长时任务;用户再次点击音乐播放时,需重新申请长时任务。)
  • 若音频在后台播放时被打断(例如:焦点打断),系统会自行检测,冻结或者取消长时任务。当应用重启音频播放时,需要再次申请长时任务。
  • 应用收到AVSession播控指令,收到音频设备变更等需要做出对应播放和暂停操作时,都需要在暂停时取消长时任务,播放时重新申请长时任务。
  • 通过AVSession投播组件后台投播,开始投播时申请长时任务,断开投播时取消长时任务。投播过程中音频暂停,无须对长时任务做处理。

具体操作请参考长时任务(ArkTS)中的开发步骤

监听前后台状态

如果应用本身没有后台播放业务,可以通过监听生命周期函数onBackground来判断应用是否已进入后台并主动停止播放。否则会受到AVSession与长时任务模块管控,对应用正常的播放业务造成影响。如需在应用回到前台时重启播放,可以通过监听生命周期函数onForeground来判断应用是否回到前台。

完整示例

使用AVPlayer后台播放

  • 本示例主要展示通过系统播放器AVPlayer实现视频类应用的开发,功能包括后台播放和系统播控中心的交互。

使用AudioRenderer后台播放

  • 本场景解决方案主要面向前台音频开发人员。指导开发者基于AudioRenderer开发音频播控功能。功能包括后台播放、系统播控中心的交互、适配不同类型的焦点打断策略、切换路由发声设备、切换输出设备等。

官方提供了一个音乐卡片的开发指导方案,可以去看看

https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-music-card

接入AVSession媒体播控中心即可实现此效果,为了使应用返回后台也能继续播放音视频,还需申请后台长时任务:

  1. 申请"音视频播放(AUDIO_PLAYBACK)"类型长时任务
  2. 接入AVSession Kit音视频播控服务

相关文档:

在HarmonyOS Next中实现后台音频播放卡片,需使用Service Ability承载音频播放逻辑,通过Form Ability创建卡片UI。在Service Ability中调用AVSession管理音频播放状态,利用FormProvider提供卡片数据绑定。系统通过分布式调度机制保持后台服务运行,卡片通过订阅机制实时更新播放信息。需在config.json中声明音频后台播放权限ohos.permission.KEEP_BACKGROUND_RUNNING和卡片配置。使用AVPlayerController控制播放流程,通过FormBindingData实现卡片与服务的动态数据交互。

在HarmonyOS Next中实现后台音频播放卡片,可以通过以下步骤完成:

  1. 使用Service Ability进行后台音频播放

    • 创建Service Ability处理音频播放逻辑,确保应用退到后台时播放不中断。
    • 通过AVSession管理媒体会话,包括播放控制(播放/暂停/切歌)和元数据(标题、专辑封面等)。
  2. 添加控制卡片(左图效果)

    • 使用FormExtensionAbility创建服务卡片,显示精简播放信息(如歌曲名、进度条)。
    • 通过updateForm动态更新卡片内容,响应播放状态变化。
  3. 实现展开详情(右图效果)

    • 在卡片配置中声明点击事件,触发onEvent回调。
    • 使用postCardAction跳转到应用的播放详情页(需在代码中处理路由逻辑)。
  4. 返回应用播放页

    • 在详情页顶部添加返回按钮,通过router.back导航回原页面,或直接调用terminateSelf结束当前页面。

关键代码示例

  • 卡片布局通过config.json配置forms字段,定义初始尺寸与动态更新能力。
  • 使用avSession发布控制命令:
    let session = await avSession.createAVSession(context, 'audio', 'com.example.audio');
    session.activate();
    
  • 通过formProvider.setFormNextRefreshTime定时刷新卡片数据。

此方案依赖HarmonyOS的卡片框架与AVSession能力,需确保声明相应权限(如ohos.permission.MANAGE_MEDIA_RESOURCES)。

回到顶部