Flutter如何基于Agora SDK实现视频通话邀请并解决相关调用报错
sendLocalInvitation errorCode:1 错误排查
Agora RTM信令SDK的呼叫错误码1为被叫用户未登录RTM系统/信令参数校验失败,你的代码存在3个核心问题:
- 仅初始化并加入了RTC音视频频道,未提前初始化RTM信令客户端、完成RTM登录流程,信令模块未就绪无法发送邀请
- sendLocalInvitation传入的
calleeId为数字类型,Agora RTM要求用户ID必须为字符串格式,类型不匹配触发参数校验失败 - 被叫用户未登录同AppID对应的RTM系统,邀请信令无法触达目标用户
双端适配视频通话邀请最优实现方案
1. 依赖配置(iOS/Android自动适配)
实现视频通话邀请需要同时依赖RTC音视频SDK和RTM信令SDK,在pubspec.yaml中添加如下依赖:
dependencies: agora_rtc_engine: ^6.2.1 # 音视频核心SDK agora_rtm: ^1.5.1 # 信令SDK,负责邀请、挂断等通知收发
保持两个SDK大版本匹配即可,无需额外原生端适配配置。
2. 通用流程设计(双端一致)
- 初始化:用户登录App后,同时初始化RTC引擎、RTM客户端,用用户唯一字符串ID登录RTM系统
- 发起邀请:主叫生成RTC频道Token,创建本地邀请实例,携带频道ID、Token、主叫信息发送给被叫
- 被叫响应:被叫收到邀请后弹窗提示,选择接听则直接加入对应RTC频道,拒绝则回发拒绝信令
- 通话结束:任意一方挂断时发送挂断信令,双方退出RTC频道、销毁视频渲染组件
3. 修复后可运行代码实现
初始化逻辑
import 'dart:convert'; import 'package:agora_rtc_engine/agora_rtc_engine.dart'; import 'package:agora_rtm/agora_rtm.dart'; late RtcEngine _rtcEngine; late AgoraRtmClient _rtmClient; late AgoraRtmCallManager _callManager; // 当前登录用户的ID,必须为字符串格式 String currentUserId = "25"; // 替换为你的Agora AppID const String agoraAppId = "你的Agora应用AppID"; // 用户登录成功后调用一次即可 Future<void> initAgoraService() async { // 初始化RTC音视频引擎 _rtcEngine = await createAgoraRtcEngine(); await _rtcEngine.initialize(const RtcEngineContext(appId: agoraAppId)); await _rtcEngine.enableVideo(); // 初始化RTM信令客户端与呼叫管理器 _rtmClient = await AgoraRtmClient.createInstance(agoraAppId); _callManager = _rtmClient.getRtmCallManager(); // 注册呼叫事件回调 _callManager.setEventHandler(AgoraRtmCallEventHandler( // 本地邀请已送达被叫 onLocalInvitationReceivedByPeer: (invitation) {}, // 被叫同意邀请,主叫加入RTC频道 onLocalInvitationAccepted: (invitation, response) async { Map extra = jsonDecode(invitation.extra ?? "{}"); await _joinRtcChannel(extra["rtcToken"], extra["channelId"], int.parse(currentUserId)); }, // 被叫拒绝邀请 onLocalInvitationRefused: (invitation, response) {}, // 收到其他用户发来的通话邀请 onRemoteInvitationReceived: (invitation) { // 此处弹出接听/拒绝弹窗即可 }, )); // 必须完成RTM登录后才能发起/接收邀请 await _rtmClient.login(null, currentUserId); }
发起邀请逻辑(修复原错误代码)
Future<void> sendVideoCallInvitation(String calleeId, String channelId) async { // calleeId必须为字符串格式,如原被叫ID15需要转为"15" String tokenRes = await getToken(channelId, int.parse(currentUserId)); String rtcToken = jsonDecode(tokenRes)["Token"]; // 创建本地邀请实例 AgoraRtmLocalInvitation invitation = AgoraRtmLocalInvitation( calleeId: calleeId, content: "视频通话邀请", // 扩展字段携带频道、Token信息,被叫可直接读取加入频道 extra: jsonEncode({ "channelId": channelId, "rtcToken": rtcToken, "callerId": currentUserId }), ); // 发送邀请,无需提前加入RTC频道,等被叫同意后再加入即可 await _callManager.sendLocalInvitation(invitation); }
加入RTC频道通用方法
Future<void> _joinRtcChannel(String token, String channelId, int uid) async { await _rtcEngine.joinChannel( token: token, channelId: channelId, uid: uid, options: const ChannelMediaOptions( channelProfile: ChannelProfileType.channelProfileCommunication, clientRoleType: ClientRoleType.clientRoleBroadcaster, ), ); }
4. 双端适配注意事项
- iOS端需在
Info.plist中添加相机、麦克风权限使用描述,Android端需在AndroidManifest.xml中添加网络、相机、麦克风权限声明,使用Agora官方标准配置即可 - 用户退出登录时必须调用
_rtmClient.logout(),避免离线账号仍收到呼叫邀请 - 弱网环境需添加30秒邀请超时逻辑,未收到被叫响应自动取消本地邀请
内容的提问来源于stack exchange,提问作者Crow_dz
相关产品推荐
相关产品推荐

