本文档说明如何在 Android、iOS、HarmonyOS 平台接入 AOQ Client SDK,实现 AOQ+qwen3.5-omni-plus-realtime 音视频通话功能。
SDK 获取
AOQ Client SDK 及音频 Opus 插件请参见SDK下载。Opus 编码以独立插件形式提供,请根据您的场景按需引入。
SDK 导入
请根据不同平台将核心 SDK 产物导入工程依赖目录,并在工程配置中声明相关权限。
Android
将 AoqClientSdk-release.aar 放入工程 app/libs/ 目录,将 libPluginOpus.so 按 ABI 放入 app/libs/armeabi-v7a/ 和 app/libs/arm64-v8a/,并在 app/build.gradle 中:
AndroidManifest.xml 声明权限:
RECORD_AUDIO 和 CAMERA 为运行时权限,应用需在运行时调用 Android ActivityCompat.requestPermissions() 方法,主动向 Android 系统申请用户授权。
iOS(framework)
-
将
AoqClientSdk.framework与PluginOpus.framework拖入 Xcode 工程,在 Target > General > Frameworks, Libraries, and Embedded Content 中选择 Embed & Sign。 -
权限声明:在 Xcode 中选中您的 Target > Info > Custom iOS Target Properties,添加以下两项权限用途描述:
Key
Value
NSMicrophoneUsageDescription用于实时语音通话
NSCameraUsageDescription用于实时视频通话
-
Swift 工程:
import AoqClientSdk;Objective-C 工程:#import <AoqClientSdk/AoqClientSdk.h>。
HarmonyOS(har)
- 将
aoq-client-sdk.har放入工程libs/目录,将libPluginOpus.so按 ABI 放入entry/libs/armeabi-v7a/和entry/libs/arm64-v8a/;并在entry/oh-package.json5中声明。 - 在
entry/src/main/module.json5添加权限:
- 在
EntryAbility中通过abilityAccessCtrl.createAtManager().requestPermissionsFromUser触发运行时授权。
体验 Demo
阿里云百炼提供适用于 Android 平台的 Demo,可用于快速验证 AOQ 接入效果。下载 APK 并配置 API Key 和 workspaceId 后,即可体验部分模型。
扫描以下二维码下载并安装 Android Demo:

AppServer获取Token
请按照Token鉴权的 AOQ 章节搭建获取 Token 的 AppServer。每次通话前,客户端需要向业务侧 AppServer 请求一次 Token。
实现 AI 音视频通话
创建引擎并设置回调
调用 createEngine 接口创建 AoqClientEngine 实例。
iOS:
AoqEngineDelegate 协议监听 onConnectionStatusChange、onDataMsg、onError 等回调。
Android:
启动音视频采集与播放
调用 startAudioCapture 与 startAudioPlayer 启动本地音频采集与播放;调用 startVideoCapture 启动摄像头,并通过 setLocalView 将 SDK 渲染目标绑定到业务侧的预览控件。
iOS:
获取连接凭证
由业务 AppServer 代理百炼请求,参见Token鉴权。
设置编解码及建立连接
设置编解码参数后调用 connect。
注意:qwen3.5-omni-plus-realtime 要求客户端在收到服务端的 session.updated 之后才能开始发送媒体数据。为避免 connect 建联成功到 session.updated 到达之间的空档期误推媒体,在 connect 之前对上行音频与视频轨道分别调用 enableSendMediaStream(trackType, false),将上行推流暂时关闭。WebSocket事件说明详见客户端事件。
iOS:
配置 AI 会话
在 onConnectionStatusChange(Connected) 回调中通过 sendDataMsg 发送 session.update 消息(业务自定义 JSON,包含 modalities、voice、instructions、turn_detection 等会话参数),完成会话握手,WebSocket事件说明详见客户端事件。
iOS:
收到 session.updated 后开启媒体发送
在 onDataMsg 回调中解析下行消息,收到模型回复 session.updated 的时候,对上一步禁推的每个轨道类型调用 enableSendMediaStream(trackType, true) 放开推流。下面为代码示例,WebSocket事件说明详见服务端事件。
iOS:
断开连接与销毁引擎
典型场景
打断(Barge-in)
- SDK 与百炼深度融合,支持百炼模型的打断消息会在新一轮对话开始时打断上一轮次。
- SDK 提供本地播放器打断接口
interruptAudioPlayer,当用户主动需要停止时可以调用打断 API 实现此功能。
静音 / 取消静音
静音后 SDK 仍在采集音频,但只推送静音帧,session 不会中断。
切换前后摄像头
通话字幕与ASR结果显示
服务端通过下行数据消息推送 ASR 结果与 AI 文本回复。业务侧在 onDataMsg 回调中根据 type 字段分流即可。WebSocket事件说明详见服务端事件。
注意事项
-
单例语义:
createEngine是单例,重复调用返回同一实例;destroy后才能重新创建。多页面共用建议在 Application/Ability 级管理引擎生命周期。 -
本地预览 View 类型:
- Android:
SurfaceView或TextureView;其它类型不支持。 - iOS:任意
UIView子类。 - HarmonyOS:请参考 SDK 文档。
- Android:
-
音频路由变化:耳机插拔、蓝牙连接等会触发
onAudioDeviceRouteChanged,业务侧通常无需处理;如果 UI 上显示"扬声器/听筒"开关,需要根据该回调同步状态。 -
后台续传:如需通话切到后台后继续传音频,
Info.plist必须开启UIBackgroundModes = audio,并在前台时正确激活AVAudioSession(SDK 会处理大部分情况,业务侧用setAudioSessionRestriction:可精细控制是否让 SDK 接管)。
iOS Demo 源码
