鸿蒙AVSession Kit

------ ArkTS 与 C/C++ 双语言、Provider 与 Controller 全角色

适用版本:HarmonyOS API 12+

覆盖:本地会话提供方(Provider)、会话控制方(Controller)、后台播放


一、设计总览(Mermaid)

graph TD subgraph 系统 PC[播控中心/耳机/车机] end subgraph 应用进程 A[AVSessionProvider<br>播放器] -->|setAVMetadata<br>setAVPlaybackState| S[AVSession] C[AVSessionController<br>控制逻辑] -->|sendControlCommand| S end PC <-->|控制命令| S
  • 任何进程都能 读 会话(获取元数据/状态)
  • 任何进程都能 写 会话(发命令)------只要拿到对应 AVSessionController

二、ArkTS 完整落地

  1. 依赖
ts 复制代码
import { avSession } from '@kit.AVSessionKit';
import { BackgroundTasks } from '@kit.BackgroundTasksKit';
  1. 会话提供方(Provider)
ts 复制代码
class MyProvider {
  private session: avSession.AVSession | null = null;

  async init(ctx: Context) {
    /* 1. 长时任务 */
    await BackgroundTasks.startBackgroundRunning(ctx, 'AUDIO_PLAYBACK', 'music');

    /* 2. 创建会话 */
    this.session = await avSession.createAVSession(ctx, 'MusicSession', 'audio');

    /* 3. 元数据 */
    await this.session.setAVMetadata({
      assetId: '10086',
      title: 'Bohemian Rhapsody',
      artist: 'Queen',
      duration: 355000,
      mediaImage: 'https://xx/cover.jpg',
      previousAssetId: '10085',
      nextAssetId: '10087'
    });

    /* 4. 播放状态 */
    await this.session.setAVPlaybackState({
      state: avSession.PlaybackState.PLAYBACK_STATE_PLAYING,
      position: { elapsedTime: 60000, updateTime: Date.now() },
      speed: 1.0,
      loopMode: avSession.LoopMode.LOOP_MODE_LIST
    });

    /* 5. 注册命令(被动) */
    this.session.on('play',     () => this.player.play());
    this.session.on('pause',    () => this.player.pause());
    this.session.on('seek',     (pos: number) => this.player.seek(pos));
    this.session.on('playNext', () => this.player.next());

    /* 6. 激活 */
    await this.session.activate();
  }

  private player = { play:()=>{}, pause:()=>{}, seek:()=>{}, next:()=>{} };

  async destroy() {
    this.session?.destroy();
    BackgroundTasks.stopBackgroundRunning(getContext(this));
  }
}
  1. 会话控制方(Controller)
ts 复制代码
class MyController {
  private ctrl: avSession.AVSessionController | null = null;

  async attach(sessionId: string) {
    this.ctrl = await avSession.createController(sessionId);
  }

  async play()  { await this.ctrl?.sendControlCommand({ command: 'play' }); }
  async pause() { await this.ctrl?.sendControlCommand({ command: 'pause' }); }
  async seek(ms: number) {
    await this.ctrl?.sendControlCommand({ command: 'seek', parameters: { position: ms } });
  }
}
  1. 枚举会话
ts 复制代码
const sessions = await avSession.getAllActiveSessions();
console.log('当前活跃会话', sessions.map(s => s.sessionTag));

三、C/C++(NDK)完整落地

  1. CMake
cmake 复制代码
find_library(avsession-lib libohavsession.so)
target_link_libraries(your_target ${avsession-lib})
  1. 会话提供方(Provider)
cpp 复制代码
// 1. 创建
OH_AVSession* session;
OH_AVSession_Create("MusicSess", SESSION_TYPE_AUDIO,
                    "com.demo", "MainAbility", &session);

// 2. 元数据
OH_AVMetadataBuilder* mb = OH_AVMetadataBuilder_Create();
OH_AVMetadataBuilder_SetAssetId(mb, "10086");
OH_AVMetadataBuilder_SetTitle(mb, "Rhapsody");
OH_AVMetadata* meta = OH_AVMetadataBuilder_Build(mb);
OH_AVSession_SetAVMetadata(session, meta);

// 3. 播放状态
OH_AVPlaybackState* ps = OH_AVPlaybackState_Create();
OH_AVPlaybackState_SetState(ps, PLAYBACK_STATE_PLAYING);
OH_AVSession_SetAVPlaybackState(session, ps);

// 4. 注册命令
OH_AVSession_RegisterCommandCallback(
    session, COMMAND_PLAY,
    [](void*){ /* real play */ }, nullptr);

OH_AVSession_Activate(session);
  1. 会话控制方(Controller)
cpp 复制代码
// 枚举
AVSession_SessionInfo* infos;
size_t cnt;
OH_AVSessionManager_GetAllActiveSessions(&infos, &cnt);

// 创建 Controller
OH_AVSessionController* ctrl;
OH_AVSessionController_Create(infos[0].sessionId, &ctrl);

// 发命令
OH_AVControllerCommand cmd = { .command = COMMAND_SEEK, .parameters.position = 30000 };
OH_AVSessionController_SendCommand(ctrl, &cmd);
  1. 清理
cpp 复制代码
OH_AVSessionController_Destroy(ctrl);
OH_AVSession_Destroy(session);

四、命令全集(两语言通用)

命令 ArkTS 参数 C++ 枚举 play { command:'play' } COMMAND_PLAY pause { command:'pause' } COMMAND_PAUSE stop { command:'stop' } COMMAND_STOP seek { command:'seek', parameters:{ position } } COMMAND_SEEK setSpeed { command:'setSpeed', parameters:{ speed } } COMMAND_SET_SPEED setLoopMode { command:'setLoopMode', parameters:{ loopMode } } COMMAND_SET_LOOP_MODE toggleFavorite { command:'toggleFavorite' } COMMAND_TOGGLE_FAVORITE playNext / playPrevious { command:'playNext'/'playPrevious' } COMMAND_PLAY_NEXT / PREVIOUS skipToQueueItem { command:'skipToQueueItem', parameters:{ itemId } } COMMAND_SKIP_TO_QUEUE_ITEM commonCommand { command:'commonCommand', parameters:{ command, extras } } COMMAND_COMMON


五、后台播放 checklist(上架必过)

  • createAVSession 的 type 与音频流类型匹配(audio / video / voice_call)
  • 激活前已 setAVMetadata + setAVPlaybackState + 注册命令
  • 已申请 AUDIO_PLAYBACK 长时任务且 pause/stop 时主动取消
  • 退出业务时 destroy 会话
  • 若支持歌单/冷启动续播,已注册 PlayMusicList / PlayAudio 意图

至此,ArkTS 与 C/C++ 双语言、Provider 与 Controller 全角色一次讲透。

相关推荐
云端漫步198712 小时前
HarmonyOS 互动卡片实战:快递卡片与睡眠卡片完整开发流程
华为·harmonyos
智塑未来13 小时前
鸿蒙6.1隐私安心加倍:加密分享、星盾防诈、应用锁三重保护,守护到位
华为·harmonyos
byte轻骑兵13 小时前
2026手机远程办公:向日葵、TeamViewer、ToDesk鸿蒙适配+传文件+AI审计功能对比
智能手机·harmonyos·todesk·teamviewer·手机远程办公
贾伟康13 小时前
【知律|06】HarmonyOS ArkTS 法律分类实战:让民法、劳动、消费等入口可维护
harmonyos·arkts·arkui·分类设计·多设备
梦想不只是梦与想1 天前
鸿蒙 测试工具:DevEco Testing(一)
测试工具·harmonyos·testing
大锅盖11 天前
Web 工单要调用相机,第一步不是打开取景框,而是建立能力门禁
前端·数码相机·harmonyos
贾伟康1 天前
【华夏二十四节气|07】HarmonyOS 6.0.2(22) ArkTS 节气搜索实战:多字段匹配与四态闭环
移动开发·harmonyos·arkts·arkui·本地搜索
大龄秃头程序员1 天前
Flutter 项目鸿蒙适配实战:从环境搭建到多环境打包全指南
harmonyos
贾伟康2 天前
【万能转换器|18】HarmonyOS ArkTS 权限与隐私实战:让 module.json5、功能说明和拒绝路径一致
移动开发·harmonyos·arkts·权限管理·隐私合规
贾伟康2 天前
【万能转换器|19】HarmonyOS ArkTS 回归测试实战:覆盖启动、空数据、异常输入和重复点击
软件测试·移动开发·harmonyos·arkts·回归测试