You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:18:02