HarmonyOS 鸿蒙Next中arkui-x不支持AVSession吗

HarmonyOS 鸿蒙Next中arkui-x不支持AVSession吗?

8 回复

不支持 AVSession。

但你可以利用 ArkUI-X 提供的 Bridge(桥接)机制,通过调用 Android 和 iOS 的原生侧能力,来实现 ArkTS 中暂不支持跨平台的 API 功能。

标准适配方案

该方案遵循分层架构设计,在公共能力层(commons层)对功能进行抽象和封装,使上层业务代码无需关心底层平台差异。

1. 抽象统一接口

commons 层定义一个统一的接口,声明需要实现的方法。

// commons/avsession/AVSessionInterface.ets

/**
 * 定义AVSession功能的统一接口
 */
interface AVSessionInterface {
  // 在此定义您需要使用的AVSession相关方法,例如:
  createSession(sessionType: string, callback: AsyncCallback<void>): void;
  setAVMetadata(metadata: AVMetadata, callback: AsyncCallback<void>): void;
  // ... 其他方法
}

2. 实现平台差异化

创建两个实现类,分别针对 HarmonyOS 和 安卓/iOS 平台。

  • 对于 HarmonyOS Next:直接使用鸿蒙原有的 @ohos.multimedia.avsession API 实现。
// commons/avsession/AVSessionLocal.ets
import { avSession } from '@kit.AVSessionKit';
import { AVSessionInterface } from '../AVSessionInterface';

export class AVSessionLocal implements AVSessionInterface {
  // 使用HarmonyOS原生API实现接口定义的方法
  createSession(sessionType: string, callback: AsyncCallback<void>): void {
    // 调用 ohos.multimedia.avsession 的相关方法
    avSession.createAVSession(this.context, 'mySession', 'audio').then(...);
  }
  // ... 实现其他方法
}
  • 对于 Android / iOS通过 Bridge 调用原生代码实现。这是解决不支持跨平台API的关键。
// commons/avsession/AVSessionArkUIX.ets
import bridge from '@arkui-x.bridge';
import { AVSessionInterface } from '../AVSessionInterface';

export class AVSessionArkUIX implements AVSessionInterface {
  private bridgeModule: bridge.BridgeObject;

  constructor() {
    // 创建与原生侧桥接模块的通信对象
    this.bridgeModule = bridge.createBridge('AVSessionService');
  }

  createSession(sessionType: string, callback: AsyncCallback<void>): void {
    // 通过bridge调用原生侧方法,并传递参数
    this.bridgeModule.callNative('createSession', { type: sessionType }, (err, result) => {
      if (err) {
        callback(err);
      } else {
        callback(null);
      }
    });
  }
  // ... 使用类似方式实现其他方法
}

在Android原生侧,您需要实现一个 AVSessionService 类来处理来自ArkTS的调用:

// Android原生代码 (Java/Kotlin)
public class AVSessionService implements IArkUIXBridge {
    @Override
    public Object onCall(String method, Object... args) {
        switch (method) {
            case "createSession":
                // 在此处使用Android原生的MediaSession或MediaController API
                // 来创建和管理音频会话
                createAndroidMediaSession((String) args[0](@ref);
                return null;
            // ... 处理其他方法调用
            default:
                return null;
        }
    }
    private void createAndroidMediaSession(String type) {
        // 实现Android端的逻辑
    }
}

iOS原生侧也需要类似的OC/Swift实现。

3. 创建统一入口

提供一个工厂类或方法,根据运行平台自动返回正确的实现实例。

// commons/avsession/AVSessionManager.ets
import { AVSessionInterface } from './AVSessionInterface';
import { AVSessionLocal } from './AVSessionLocal';
import { AVSessionArkUIX } from './AVSessionArkUIX';

export class AVSessionManager {
  static getInterface(): AVSessionInterface {
    // 根据运行平台判断返回哪个实现
    if (平台是HarmonyOS Next) {
      return new AVSessionLocal();
    } else {
      return new AVSessionArkUIX();
    }
  }
}

4. 在上层业务中调用

在您的业务代码(features层)中,通过统一的入口获取接口实例并进行调用,完全无需感知底层是鸿蒙API还是Bridge调用。

// 在您的页面或业务组件中
import { AVSessionManager } from '../commons/avsession/AVSessionManager';

let avSessionInstance = AVSessionManager.getInterface();
// 接下来可以统一地使用接口定义的方法
avSessionInstance.createSession('audio', (err) => {
  if (err) {
    console.error('Create session failed');
  } else {
    console.info('Session created');
  }
});

总结

当遇到 ArkUI-X 不支持的 API(如您提到的 AVSession)时,解决方案是:

  1. 使用 Bridge 桥接:这是 ArkUI-X 提供的核心跨平台通信能力。
  2. 采用分层架构:在 commons 层抽象接口,并提供鸿蒙原生和桥接两种实现。
  3. 原生代码实现:在 Android 和 iOS 侧分别使用其平台特有的 API(如 Android 的 MediaSession)完成功能实现。
  4. 对上层业务透明:通过统一的工厂方法返回接口实例,使业务层代码保持简洁和跨平台一致性。

更多关于HarmonyOS 鸿蒙Next中arkui-x不支持AVSession吗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


createAVSession在arkui-x框架里不支持,要怎么写。

// xxxAPI.ts,文件类型为ts
export class xxxAPI {
  // @ts-ignore
  API.function(); // 具体不支持跨平台方法
}
// AVSessionHM.ts
import { avSession as AVSessionManager } from '@kit.AVSessionKit';
import { Context } from '@kit.AbilityKit';

export class AVSessionHM{
  // @ts-ignore
  private context: Context;
  constructor(context:Context) {
    this.context=context;
  }

  async sendMessage() {
    let type: AVSessionManager.AVSessionType = 'audio';
    let session = await AVSessionManager.createAVSession(this.context, 'SESSION_NAME', type);
    // 激活接口要在元数据、控制命令注册完成之后再执行。
    await session.activate();
  }
}

构建报错:

/Applications/DevEco-Studio.app/Contents/tools/node/bin/node /Applications/DevEco-Studio.app/Contents/tools/hvigor/bin/hvigorw.js --mode module -p module=entry@default -p product=default -p requiredDeviceType=phone assembleHap --analyze=normal --parallel --incremental --daemon

> hvigor UP-TO-DATE :entry:default@PreBuild...  

> hvigor Finished :entry:default@CreateModuleInfo... after 1 ms 

> hvigor UP-TO-DATE :entry:default@GenerateMetadata...  

> hvigor Finished :entry:default@ConfigureCmake... after 1 ms 

> hvigor UP-TO-DATE :entry:default@MergeProfile...  

> hvigor UP-TO-DATE :entry:default@CreateBuildProfile...  

> hvigor Finished :entry:default@PreCheckSyscap... after 1 ms 

> hvigor Finished :entry:default@GeneratePkgContextInfo... after 1 ms 

> hvigor Finished :entry:default@ProcessIntegratedHsp... after 1 ms 

> hvigor Finished :entry:default@BuildNativeWithCmake... after 1 ms 

> hvigor UP-TO-DATE :entry:default@MakePackInfo...  

> hvigor Finished :entry:default@SyscapTransform... after 1 ms 

> hvigor UP-TO-DATE :entry:default@ProcessProfile...  

> hvigor UP-TO-DATE :entry:default@ProcessRouterMap...  

> hvigor Finished :entry:default@ProcessStartupConfig... after 1 ms 

> hvigor Finished :entry:default@BuildNativeWithNinja... after 1 ms 

> hvigor UP-TO-DATE :entry:default@ProcessResource...  

> hvigor UP-TO-DATE :entry:default@GenerateLoaderJson...  

> hvigor UP-TO-DATE :entry:default@ProcessLibs...  

> hvigor UP-TO-DATE :entry:default@CompileResource...  

> hvigor UP-TO-DATE :entry:default@DoNativeStrip...  

> hvigor Finished :entry:default@BuildJS... after 2 ms 

> hvigor UP-TO-DATE :entry:default@CacheNativeLibs...  

> hvigor ERROR: Failed :entry:default@CompileArkTS... 

> hvigor ERROR: ArkTS Compiler Error

1 WARN: ArkTS:WARN File: /Users/suyuwen/DevEcoStudioProjects/MyApplication/entry/src/main/ets/models/ErrorHandler.ets:16:18

 'showToast' has been deprecated.

1 ERROR: ArkTS:ERROR File: /Users/suyuwen/DevEcoStudioProjects/MyApplication/entry/src/main/ets/bridge/AVSessionHM.ts:13:25

 'AVSessionManager' can't support crossplatform application.

2 ERROR: ArkTS:ERROR File: /Users/suyuwen/DevEcoStudioProjects/MyApplication/entry/src/main/ets/bridge/AVSessionHM.ts:13:42

 'createAVSession' can't support crossplatform application.

3 ERROR: ArkTS:ERROR File: /Users/suyuwen/DevEcoStudioProjects/MyApplication/entry/src/main/ets/bridge/AVSessionHM.ts:15:19

 'activate' can't support crossplatform application.

COMPILE RESULT:FAIL {ERROR:4 WARN:1}

> hvigor ERROR: BUILD FAILED in 554 ms 

Process finished with exit code -1

纯鸿蒙应用(仅部署 HarmonyOS 设备)

支持情况

可直接使用 AVSession 相关功能,需通过鸿蒙原生 API 实现:

import { avSession } from '@kit.AVSessionKit';
// 创建本地会话
let session = avSession.createAVSession('session_tag', 'audio');

跨平台应用 ArkUI-X 无法直接调用 AVSession 接口,需通过以下方式解决:

  1. 条件编译:区分鸿蒙与非鸿蒙平台代码。

  2. 桥接层设计:非鸿蒙平台需实现等效逻辑(如 Android 的 MediaSession)。

  3. 功能降级:在非目标平台隐藏投播、后台播放等特性。

目前ArkUI-X不支持AVSession,具体可支持的API可参考:ArkUI-X 5.0.1 Release

目前HarmonyOS Next的ArkUI-X框架确实暂未支持AVSession媒体会话功能。AVSession主要用于媒体播放控制场景,在鸿蒙原应用开发中可通过相关API实现跨应用媒体控制交互。ArkUI-X作为跨平台框架,当前版本的功能适配仍在完善中,部分鸿蒙特色能力尚未完全移植。如需使用AVSession功能,需采用鸿蒙原生ArkUI开发方式。具体功能支持情况需关注后续版本更新。

是的,目前HarmonyOS Next的ArkUI-X暂未支持AVSession能力。AVSession主要用于媒体播放控制场景,在HarmonyOS API 9及之后的版本中作为系统服务提供,但ArkUI-X作为跨框架开发方案,其能力集仍在持续扩展中。

若需实现媒体会话控制功能,建议:

  1. 使用HarmonyOS原生ArkUI开发(支持AVSessionManager完整能力)
  2. 关注ArkUI-X官方路线图,等待后续版本对媒体服务能力的支持
  3. 通过Native API桥接方式临时实现特定功能(需自行处理平台差异)

具体兼容性可查阅ArkUI-X官方文档的"能力差异说明"章节。

回到顶部