|
|
|
@ -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<String, dynamic>; |
|
|
|
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 = <String, String>{ |
|
|
|
'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修改现有消息) |
|
|
|
|