From 35ef3c2c1dd5575c56c62b84a8e779cbfdee38b5 Mon Sep 17 00:00:00 2001 From: Jolie <412895109@qq.com> Date: Tue, 30 Dec 2025 15:49:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(call):=20=E9=9B=86=E6=88=90=20RTM=20?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=A4=84=E7=90=86=E9=80=9A=E8=AF=9D=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 dart:typed_data 和 agora_rtm 依赖包 - 实现 RTM 消息监听器注册功能 - 添加处理通话相关 RTM 消息的逻辑 - 支持接收和解析通话接受消息更新远端用户 UID - 简化发送通话消息的逻辑并移除旧的 IMManager 方式 --- lib/controller/message/call_controller.dart | 77 ++++++++++++++------- 1 file changed, 51 insertions(+), 26 deletions(-) diff --git a/lib/controller/message/call_controller.dart b/lib/controller/message/call_controller.dart index 0db4d5a..6114014 100644 --- a/lib/controller/message/call_controller.dart +++ b/lib/controller/message/call_controller.dart @@ -1,6 +1,8 @@ import 'dart:async'; import 'dart:convert'; +import 'dart:typed_data'; import 'package:agora_rtc_engine/agora_rtc_engine.dart'; +import 'package:agora_rtm/agora_rtm.dart'; import 'package:audioplayers/audioplayers.dart'; import 'package:dating_touchme_app/generated/assets.dart'; import 'package:dating_touchme_app/im/im_manager.dart'; @@ -106,6 +108,50 @@ class CallController extends GetxController { await _callAudioPlayer.play(AssetSource(Assets.audioCall.replaceFirst('assets/', ''))); } }); + + // 注册 RTM 消息监听器,用于接收通话相关的 RTM 消息 + _registerRtmMessageListener(); + } + + /// 注册 RTM 消息监听器 + void _registerRtmMessageListener() { + RTMManager.instance.onMessageEvent = (MessageEvent event) { + _handleRtmMessage(event); + }; + print('✅ [CallController] RTM 消息监听器已注册'); + } + + /// 处理 RTM 消息 + void _handleRtmMessage(MessageEvent event) { + try { + // 解析消息内容 + String messageText; + if (event.message is String) { + messageText = event.message as String; + } else if (event.message is Uint8List) { + messageText = utf8.decode(event.message as Uint8List); + } else { + messageText = event.message.toString(); + } + + final messageData = json.decode(messageText) as Map; + print('📥 [CallController] 收到 RTM 消息: $messageData'); + + // 处理通话消息 + if (messageData['type'] == 'call_message') { + final event = messageData['event'] as String?; + if (event == 'accept') { + // 发起方收到 accept 消息,设置远端用户 UID + final uid = messageData['uid']; + if (uid != null) { + remoteUid.value = uid is int ? uid : int.tryParse(uid.toString()); + print('📞 [CallController] 收到 accept 消息,设置 remoteUid: ${remoteUid.value}'); + } + } + } + } catch (e) { + print('❌ [CallController] 处理 RTM 消息失败: $e'); + } } /// 创建一对一RTC频道 @@ -432,33 +478,12 @@ class CallController extends GetxController { ChatController? chatController, }) async { // 如果提供了 chatController,使用它发送消息 - if (chatController != null) { - return await chatController.sendCallMessage( - callType: callType, - callStatus: callStatus, - callDuration: callDuration, - channelId: channelId, - ); - } - - // 否则直接通过 IMManager 发送自定义消息 - final callParams = { - 'callType': callType, - 'callStatus': callStatus, - }; - if (callDuration != null) { - callParams['callDuration'] = callDuration.toString(); - } - if (channelId != null && channelId.isNotEmpty) { - callParams['channelId'] = channelId; - } - - final message = await IMManager.instance.sendCustomMessage( - targetUserId, - 'call', - callParams, + return await chatController!.sendCallMessage( + callType: callType, + callStatus: callStatus, + callDuration: callDuration, + channelId: channelId, ); - return message != null; } /// 更新通话消息状态(使用modifyMessage修改现有消息)