鸿蒙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 全角色一次讲透。

相关推荐
贾伟康4 小时前
【化学实验室|07】HarmonyOS ArkTS 知识全局搜索实战:实现跨知识点、公式与阅读内容的本地检索
harmonyos·arkts·arkui·本地搜索·化学知识
马剑威(威哥爱编程)4 小时前
【共创稿事节】HarmonyOS 7 Agent 开发实战 08:结构化输出解析
华为·harmonyos
donk13145 小时前
React Native for OpenHarmony 实战:三方库 react-native-segmented-control-tab 的鸿蒙化适配指南
javascript·react native·react.js·华为·harmonyos
360智汇云5 小时前
鸿蒙开发中如何实现画中画
华为·harmonyos
donk13147 小时前
React Native for OpenHarmony 实战:三方库 react-native-toast-message 的鸿蒙化适配指南
react native·react.js·音视频·harmonyos
Flutter_OH7 小时前
Flutter OHOS Dart 堆栈符号化
harmonyos
Flutter_OH8 小时前
Flutter OHOS Flutter 多设备自适应 DPI 指导文档
harmonyos
SuperHeroWu78 小时前
【HarmonyOS 7】 应用 Agent 接入云 A2A 与端 A2A 的实践详解
ai·harmonyos·小艺
用户29469405448169 小时前
个人开发者上架鸿蒙 AI 应用,最后倒在安全评估实名制这一格
harmonyos·deepseek
Keya9 小时前
HarmonyOS 开发实战:用 util.Aspect 玩转 AOP 切面编程
harmonyos