|
|
|
@ -205,12 +205,12 @@ class CallController extends GetxController { |
|
|
|
|
|
|
|
/// 创建音频通话频道 |
|
|
|
Future<RtcChannelData?> createAudioChannel() { |
|
|
|
return createOneOnOneRtcChannel(type: 1); |
|
|
|
return createOneOnOneRtcChannel(type: 2); |
|
|
|
} |
|
|
|
|
|
|
|
/// 创建视频通话频道 |
|
|
|
Future<RtcChannelData?> createVideoChannel() { |
|
|
|
return createOneOnOneRtcChannel(type: 2); |
|
|
|
return createOneOnOneRtcChannel(type: 3); |
|
|
|
} |
|
|
|
|
|
|
|
/// 发起通话 |
|
|
|
@ -266,6 +266,7 @@ class CallController extends GetxController { |
|
|
|
callStatus: 'waitCalling', // 初始状态为未接听,等待对方响应 |
|
|
|
channelId: channelData.channelId, // 传递频道ID |
|
|
|
chatController: chatController, |
|
|
|
uid: channelData.uid, |
|
|
|
); |
|
|
|
|
|
|
|
startCallAudio(); |
|
|
|
@ -339,15 +340,7 @@ class CallController extends GetxController { |
|
|
|
// 开始计时 |
|
|
|
_startCallTimer(); |
|
|
|
|
|
|
|
// 更新通话消息状态为通话中 |
|
|
|
await _updateCallMessageStatus( |
|
|
|
message: message, |
|
|
|
callStatus: 'calling', |
|
|
|
callDuration: 0, |
|
|
|
chatController: chatController, |
|
|
|
); |
|
|
|
|
|
|
|
// 从通话信息中获取 channelId |
|
|
|
// 从通话信息中获取 channelId 和 uid |
|
|
|
final channelId = callInfo['channelId'] as String?; |
|
|
|
if (channelId == null || channelId.isEmpty) { |
|
|
|
print('❌ [CallController] channelId 为空,无法加入 RTC 频道'); |
|
|
|
@ -373,6 +366,13 @@ class CallController extends GetxController { |
|
|
|
await joinChannel(channelId); |
|
|
|
print('✅ [CallController] 已加入 RTC 频道: $channelId'); |
|
|
|
|
|
|
|
// 加入 RTC 频道后,从消息中获取发起方的 uid,设置为远端用户 UID |
|
|
|
final initiatorUid = callInfo['uid'] as int?; |
|
|
|
if (initiatorUid != null) { |
|
|
|
remoteUid.value = initiatorUid; |
|
|
|
print('📞 [CallController] 从消息中获取到发起方 UID: $initiatorUid,已设置 remoteUid'); |
|
|
|
} |
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
@ -388,13 +388,6 @@ class CallController extends GetxController { |
|
|
|
// 停止播放来电铃声(已拒绝) |
|
|
|
stopCallAudio(); |
|
|
|
|
|
|
|
// 更新通话消息状态为已拒绝 |
|
|
|
await _updateCallMessageStatus( |
|
|
|
message: message, |
|
|
|
callStatus: 'rejected', |
|
|
|
chatController: chatController, |
|
|
|
); |
|
|
|
|
|
|
|
// 清理通话会话 |
|
|
|
currentCall.value = null; |
|
|
|
|
|
|
|
@ -413,15 +406,6 @@ class CallController extends GetxController { |
|
|
|
}) async { |
|
|
|
print('📞 [CallController] 取消通话'); |
|
|
|
|
|
|
|
// 如果有消息,更新通话消息状态为已取消 |
|
|
|
if (message != null) { |
|
|
|
await _updateCallMessageStatus( |
|
|
|
message: message, |
|
|
|
callStatus: 'cancelled', |
|
|
|
chatController: chatController, |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
// 停止播放来电铃声(已取消) |
|
|
|
stopCallAudio(); |
|
|
|
|
|
|
|
@ -453,16 +437,6 @@ class CallController extends GetxController { |
|
|
|
// 停止计时 |
|
|
|
_stopCallTimer(); |
|
|
|
|
|
|
|
// 如果有消息,更新通话消息状态为通话中(显示时长) |
|
|
|
if (message != null) { |
|
|
|
await _updateCallMessageStatus( |
|
|
|
message: message, |
|
|
|
callStatus: 'calling', |
|
|
|
callDuration: callDuration, |
|
|
|
chatController: chatController, |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
// 清理通话会话和远端用户UID |
|
|
|
currentCall.value = null; |
|
|
|
remoteUid.value = null; |
|
|
|
@ -502,6 +476,7 @@ class CallController extends GetxController { |
|
|
|
required String callType, |
|
|
|
required String callStatus, |
|
|
|
int? callDuration, |
|
|
|
int? uid, |
|
|
|
String? channelId, |
|
|
|
ChatController? chatController, |
|
|
|
}) async { |
|
|
|
@ -511,89 +486,10 @@ class CallController extends GetxController { |
|
|
|
callStatus: callStatus, |
|
|
|
callDuration: callDuration, |
|
|
|
channelId: channelId, |
|
|
|
uid: uid, |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
/// 更新通话消息状态(使用modifyMessage修改现有消息) |
|
|
|
Future<bool> _updateCallMessageStatus({ |
|
|
|
required EMMessage message, |
|
|
|
required String callStatus, |
|
|
|
int? callDuration, |
|
|
|
ChatController? chatController, |
|
|
|
}) async { |
|
|
|
// 解析现有通话信息 |
|
|
|
final callInfo = _parseCallInfo(message); |
|
|
|
if (callInfo == null) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
final callType = callInfo['callType'] as String? ?? 'voice'; |
|
|
|
final messageId = message.msgId; |
|
|
|
|
|
|
|
if (messageId.isEmpty) { |
|
|
|
print('❌ [CallController] 消息ID为空,无法修改消息'); |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
// 如果是自定义消息,使用modifyMessage修改 |
|
|
|
if (message.body.type == MessageType.CUSTOM) { |
|
|
|
// 构建新的参数 |
|
|
|
final callParams = <String, String>{ |
|
|
|
'callType': callType, |
|
|
|
'callStatus': callStatus, |
|
|
|
}; |
|
|
|
if (callDuration != null) { |
|
|
|
callParams['callDuration'] = callDuration.toString(); |
|
|
|
} |
|
|
|
|
|
|
|
// 创建新的消息体 |
|
|
|
final customBody = EMCustomMessageBody(event: 'call', params: callParams); |
|
|
|
|
|
|
|
// 使用modifyMessage修改消息 |
|
|
|
final success = await IMManager.instance.modifyMessage( |
|
|
|
messageId: messageId, |
|
|
|
msgBody: customBody, |
|
|
|
attributes: null, // 不修改扩展属性 |
|
|
|
); |
|
|
|
|
|
|
|
if (success) { |
|
|
|
print( |
|
|
|
'✅ [CallController] 消息修改成功: messageId=$messageId, callStatus=$callStatus', |
|
|
|
); |
|
|
|
|
|
|
|
// 如果提供了chatController,更新本地消息列表 |
|
|
|
if (chatController != null) { |
|
|
|
// 更新消息体中的参数 |
|
|
|
final index = chatController.messages.indexWhere( |
|
|
|
(msg) => msg.msgId == messageId, |
|
|
|
); |
|
|
|
if (index != -1) { |
|
|
|
final updatedMessage = chatController.messages[index]; |
|
|
|
if (updatedMessage.body.type == MessageType.CUSTOM) { |
|
|
|
final customBody = updatedMessage.body as EMCustomMessageBody; |
|
|
|
// 创建新的参数Map并更新 |
|
|
|
final updatedParams = Map<String, String>.from( |
|
|
|
customBody.params ?? {}, |
|
|
|
); |
|
|
|
updatedParams['callType'] = callType; |
|
|
|
updatedParams['callStatus'] = callStatus; |
|
|
|
if (callDuration != null) { |
|
|
|
updatedParams['callDuration'] = callDuration.toString(); |
|
|
|
} |
|
|
|
// 注意:EMCustomMessageBody的params可能是只读的,这里可能需要重新创建消息 |
|
|
|
// 暂时先通知UI更新,实际的消息体更新会在收到onMessageContentChanged回调时处理 |
|
|
|
chatController.update(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return success; |
|
|
|
} |
|
|
|
// 如果不是自定义消息,返回失败 |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
/// 从自定义消息中解析通话信息 |
|
|
|
Map<String, dynamic>? _parseCallInfo(EMMessage message) { |
|
|
|
if (message.body.type == MessageType.CUSTOM) { |
|
|
|
@ -607,6 +503,7 @@ class CallController extends GetxController { |
|
|
|
? int.tryParse(params['callDuration']!) |
|
|
|
: null, |
|
|
|
'channelId': params['channelId'], |
|
|
|
'uid': params['uid'] != null ? int.tryParse(params['uid']!) : null, |
|
|
|
}; |
|
|
|
} |
|
|
|
} |
|
|
|
|