|
|
@ -161,6 +161,8 @@ class CallController extends GetxController { |
|
|
} else if (event == 'hangup') { |
|
|
} else if (event == 'hangup') { |
|
|
// 收到挂断消息,执行退出逻辑 |
|
|
// 收到挂断消息,执行退出逻辑 |
|
|
print('📞 [CallController] 收到 hangup 消息,执行退出逻辑'); |
|
|
print('📞 [CallController] 收到 hangup 消息,执行退出逻辑'); |
|
|
|
|
|
RTMManager.instance.unsubscribe(messageData['channelId']); |
|
|
|
|
|
SmartDialog.dismiss(tag: 'video_call_invite_dialog'); |
|
|
_handleHangupMessage(); |
|
|
_handleHangupMessage(); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
@ -231,8 +233,6 @@ class CallController extends GetxController { |
|
|
|
|
|
|
|
|
// 清空之前的远端用户UID和通话信息 |
|
|
// 清空之前的远端用户UID和通话信息 |
|
|
remoteUid.value = null; |
|
|
remoteUid.value = null; |
|
|
_callChannelId = null; |
|
|
|
|
|
_callUid = null; |
|
|
|
|
|
|
|
|
|
|
|
print( |
|
|
print( |
|
|
'📞 [CallController] 发起${callType == CallType.video ? "视频" : "语音"}通话,目标用户: $targetUserId', |
|
|
'📞 [CallController] 发起${callType == CallType.video ? "视频" : "语音"}通话,目标用户: $targetUserId', |
|
|
@ -241,7 +241,8 @@ class CallController extends GetxController { |
|
|
// 发起通话前,先创建一对一 RTC 频道 |
|
|
// 发起通话前,先创建一对一 RTC 频道 |
|
|
final type = callType == CallType.video ? 2 : 1; // 1为音频,2为视频 |
|
|
final type = callType == CallType.video ? 2 : 1; // 1为音频,2为视频 |
|
|
final channelData = await createOneOnOneRtcChannel(type: type); |
|
|
final channelData = await createOneOnOneRtcChannel(type: type); |
|
|
|
|
|
|
|
|
|
|
|
_callUid = channelData?.uid; |
|
|
|
|
|
_callChannelId = channelData?.channelId; |
|
|
if (channelData == null) { |
|
|
if (channelData == null) { |
|
|
print('❌ [CallController] 创建RTC频道失败,无法发起通话'); |
|
|
print('❌ [CallController] 创建RTC频道失败,无法发起通话'); |
|
|
SmartDialog.showToast('创建通话频道失败'); |
|
|
SmartDialog.showToast('创建通话频道失败'); |
|
|
@ -399,30 +400,6 @@ class CallController extends GetxController { |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/// 取消通话 |
|
|
|
|
|
/// [message] 通话消息(可选,如果是发起方取消) |
|
|
|
|
|
/// [chatController] 聊天控制器,用于更新通话消息 |
|
|
|
|
|
Future<bool> cancelCall({ |
|
|
|
|
|
EMMessage? message, |
|
|
|
|
|
ChatController? chatController, |
|
|
|
|
|
}) async { |
|
|
|
|
|
print('📞 [CallController] 取消通话'); |
|
|
|
|
|
|
|
|
|
|
|
// 停止播放来电铃声(已取消) |
|
|
|
|
|
stopCallAudio(); |
|
|
|
|
|
|
|
|
|
|
|
// 停止计时 |
|
|
|
|
|
_stopCallTimer(); |
|
|
|
|
|
|
|
|
|
|
|
// 清理通话会话 |
|
|
|
|
|
currentCall.value = null; |
|
|
|
|
|
|
|
|
|
|
|
// TODO: 这里可以集成实际的通话SDK,取消通话 |
|
|
|
|
|
// 例如:await RTCManager.instance.cancelCall(); |
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// 结束通话(通话完成) |
|
|
/// 结束通话(通话完成) |
|
|
/// [callDuration] 通话时长(秒) |
|
|
/// [callDuration] 通话时长(秒) |
|
|
/// [chatController] 聊天控制器,用于更新通话消息 |
|
|
/// [chatController] 聊天控制器,用于更新通话消息 |
|
|
@ -647,11 +624,27 @@ class CallController extends GetxController { |
|
|
|
|
|
|
|
|
/// 挂断通话 |
|
|
/// 挂断通话 |
|
|
Future<void> hangUpCall() async { |
|
|
Future<void> hangUpCall() async { |
|
|
// 发送 RTM 挂断消息 |
|
|
|
|
|
|
|
|
final callSession = currentCall.value; |
|
|
|
|
|
|
|
|
|
|
|
// 如果是发起方且处于呼叫中状态(对方还没接听),先调用取消接口 |
|
|
|
|
|
if (callSession != null && |
|
|
|
|
|
callSession.isInitiator && |
|
|
|
|
|
callDurationSeconds.value == 0 && |
|
|
|
|
|
_callChannelId != null && |
|
|
|
|
|
_callChannelId!.isNotEmpty) { |
|
|
|
|
|
final response = await _networkService.rtcApi.cancelOneOnOneRtcChannel({ |
|
|
|
|
|
'channelId': _callChannelId!, |
|
|
|
|
|
}); |
|
|
|
|
|
if (!response.data.isSuccess) { |
|
|
|
|
|
SmartDialog.showToast(response.data.message); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
print('✅ [CallController] 已调用取消一对一RTC频道接口,channelId: $_callChannelId'); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (_callChannelId != null && |
|
|
if (_callChannelId != null && |
|
|
_callChannelId!.isNotEmpty && |
|
|
_callChannelId!.isNotEmpty && |
|
|
_callUid != null) { |
|
|
_callUid != null) { |
|
|
final callSession = currentCall.value; |
|
|
|
|
|
final callType = callSession?.callType == CallType.video |
|
|
final callType = callSession?.callType == CallType.video |
|
|
? 'video' |
|
|
? 'video' |
|
|
: 'voice'; |
|
|
: 'voice'; |
|
|
@ -661,6 +654,7 @@ class CallController extends GetxController { |
|
|
message: json.encode({ |
|
|
message: json.encode({ |
|
|
'type': 'call_message', |
|
|
'type': 'call_message', |
|
|
'uid': _callUid!, |
|
|
'uid': _callUid!, |
|
|
|
|
|
'channelId': _callChannelId, |
|
|
'callType': callType, |
|
|
'callType': callType, |
|
|
'event': 'hangup', |
|
|
'event': 'hangup', |
|
|
}), |
|
|
}), |
|
|
@ -687,6 +681,13 @@ class CallController extends GetxController { |
|
|
|
|
|
|
|
|
/// 处理挂断消息(对方挂断时调用) |
|
|
/// 处理挂断消息(对方挂断时调用) |
|
|
Future<void> _handleHangupMessage() async { |
|
|
Future<void> _handleHangupMessage() async { |
|
|
|
|
|
// 关闭视频通话邀请弹框(如果正在显示) |
|
|
|
|
|
SmartDialog.dismiss(); |
|
|
|
|
|
print('✅ [CallController] 已关闭视频通话邀请弹框'); |
|
|
|
|
|
|
|
|
|
|
|
// 停止播放来电铃声 |
|
|
|
|
|
stopCallAudio(); |
|
|
|
|
|
|
|
|
// 离开RTC频道 |
|
|
// 离开RTC频道 |
|
|
await RTCManager.instance.leaveChannel(); |
|
|
await RTCManager.instance.leaveChannel(); |
|
|
|
|
|
|
|
|
|