Browse Source

fix(call): 修复通话挂断和邀请弹框处理逻辑

- 在收到hangup消息时取消频道订阅并关闭视频通话邀请弹框
- 修复通话发起时频道ID和UID的赋值时机问题
- 移除已废弃的取消通话相关代码
- 在挂断通话时根据发起方身份调用相应的取消接口
- 优化挂断消息处理逻辑,确保弹框正确关闭和音频停止
- 在IM管理器中添加频道订阅逻辑,完善通话邀请处理
- 修复接收方收到挂断消息时的弹框关闭和音频停止逻辑
master
Jolie 3 months ago
parent
commit
5977d99462
4 changed files with 44 additions and 36 deletions
  1. 59
      lib/controller/message/call_controller.dart
  2. 3
      lib/im/im_manager.dart
  3. 7
      lib/pages/message/video_call_page.dart
  4. 11
      lib/service/live_chat_message_service.dart

59
lib/controller/message/call_controller.dart

@ -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; // 12 final type = callType == CallType.video ? 2 : 1; // 12
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();

3
lib/im/im_manager.dart

@ -1,5 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'dart:async'; import 'dart:async';
import 'package:dating_touchme_app/rtc/rtm_manager.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@ -1457,6 +1458,7 @@ class IMManager {
if (callInfo != null && callType != null && callStatus != null) { if (callInfo != null && callType != null && callStatus != null) {
// missed calling // missed calling
if ((callType == 'video' || callType == 'voice') && (callStatus == 'waitCalling' || callStatus == 'calling')) { if ((callType == 'video' || callType == 'voice') && (callStatus == 'waitCalling' || callStatus == 'calling')) {
RTMManager.instance.subscribe(channelId ?? '');
// //
Map<String, dynamic>? attributes; Map<String, dynamic>? attributes;
try { try {
@ -1502,6 +1504,7 @@ class IMManager {
// //
SmartDialog.show( SmartDialog.show(
tag: 'video_call_invite_dialog',
builder: (context) { builder: (context) {
return VideoCallInviteDialog( return VideoCallInviteDialog(
avatarUrl: finalAvatarUrl, avatarUrl: finalAvatarUrl,

7
lib/pages/message/video_call_page.dart

@ -668,13 +668,6 @@ class _VideoCallPageState extends State<VideoCallPage> {
chatController = Get.find<ChatController>(tag: tag); chatController = Get.find<ChatController>(tag: tag);
} }
if (widget.callMessage == null) {
// 使
await _callController.endCall(callDuration: 0);
Get.back();
return;
}
final rejected = await _callController.rejectCall( final rejected = await _callController.rejectCall(
message: widget.callMessage!, message: widget.callMessage!,
chatController: chatController, chatController: chatController,

11
lib/service/live_chat_message_service.dart

@ -87,6 +87,17 @@ class LiveChatMessageService {
callController.remoteUid.value = uid is int ? uid : int.tryParse(uid.toString()); callController.remoteUid.value = uid is int ? uid : int.tryParse(uid.toString());
print('📞 [LiveChatMessageService] 收到 accept 消息,设置 remoteUid: ${callController.remoteUid.value}'); print('📞 [LiveChatMessageService] 收到 accept 消息,设置 remoteUid: ${callController.remoteUid.value}');
} }
} else if (event == 'hangup') {
// hangup
SmartDialog.dismiss();
print('📞 [LiveChatMessageService] 收到 hangup 消息,已关闭视频通话邀请弹框');
//
if (Get.isRegistered<CallController>()) {
final callController = Get.find<CallController>();
callController.stopCallAudio();
print('📞 [LiveChatMessageService] 已停止播放来电铃声');
}
} }
return; return;
} }

Loading…
Cancel
Save