外观
发起、接听与结束
通话界面监听同一个 Call Controller。按钮调用控制器操作,页面根据控制器状态展示来电、连接、通话及结束结果。
发起单聊
dart
await calls.controller.startCall(
participants: const [
MixinImCallParticipant(
userId: '90002',
displayName: '测试用户 B',
),
],
mediaType: MixinImCallMediaType.audio,
currentUserName: '测试用户 A',
);calls 是已初始化且绑定当前 IM 的实例,示例用户需替换为真实测试账号。participants 只传被邀请者,SDK 自动加入当前用户。视频使用配套媒体类型,并完成摄像头权限接入。
群通话还需指定群范围、群 ID 与对应成员。当前总人数最多 9 人,所有操作仍须经过服务端的用户状态、关系与群成员校验。
关键状态
| 阶段 | 页面行为 |
|---|---|
| 拨出等待 | 展示被叫资料与取消入口 |
| 来电待接 | 展示主叫资料、接听与拒接 |
| 媒体连接中 | 停止重复接听,显示连接进度 |
| 通话中 | 根据真实轨道与音频路由更新控件 |
| 结束或失败 | 展示结果并等待资源释放 |
邀请到达、接听和媒体建立分别对应不同阶段。有效通话时长从媒体连接建立后开始累计,控件跟随媒体状态更新。
接听与结束
dart
// 在用户点击对应按钮时分别调用,不要顺序连续执行。
await calls.controller.accept();
await calls.controller.reject();
await calls.controller.hangup();默认 Call UIKit 已组织这些操作;自定义页面负责展示和用户交互,通话状态与媒体释放仍交给 SDK。
通话结束后由 SDK 释放媒体房间、系统音频和占用状态。重拨使用新的通话流程与房间授权。
失败与恢复
被对方隐私设置阻止时可收到 call_peer_blocked,关系不允许时可收到 call_relationship_denied。这些是业务拒绝,不是持续重试网络连接能够解决的问题。
网络切换、授权续期和媒体连接异常由控制器统一协调。媒体授权使用绑定当前通话与房间的短效 Token。
声音输出
音频路由由 Call SDK 统一控制。页面通过 audioRouteState 展示听筒、扬声器和可选外设;用户切换后,以返回的路由状态更新选中项。
联调覆盖忙线、拒接、超时、连续重拨、群成员离开、弱网切换与挂断后普通媒体恢复。后台和权限要求见 权限与后台来电。