diff --git a/lib/controller/discover/room_controller.dart b/lib/controller/discover/room_controller.dart index 516d1a2..6fe806c 100644 --- a/lib/controller/discover/room_controller.dart +++ b/lib/controller/discover/room_controller.dart @@ -238,8 +238,19 @@ class RoomController extends GetxController with WidgetsBindingObserver { } Future joinChat(CurrentRole role) async { - final granted = await _ensureRtcPermissions(); - if (!granted) return; + // 根据角色检查权限:男/女嘉宾需要摄像头和麦克风权限,普通观众只需要麦克风权限 + bool granted = false; + if (role == CurrentRole.maleAudience || role == CurrentRole.femaleAudience) { + // 男/女嘉宾上麦:需要摄像头和麦克风权限 + granted = await _ensureRtcPermissions(); + } else { + // 普通观众上麦:只需要麦克风权限 + granted = await _ensureMicrophonePermission(); + } + if (!granted) { + print('❌ [RoomController] 权限检查失败,无法上麦'); + return; + } final data = { 'channelId': RTCManager.instance.currentChannelId, 'seatNumber': role == CurrentRole.maleAudience ? 1 : 2, @@ -374,6 +385,22 @@ class RoomController extends GetxController with WidgetsBindingObserver { return false; } + /// 检查麦克风权限(用于普通观众上麦) + Future _ensureMicrophonePermission() async { + final micStatus = await Permission.microphone.request(); + if (micStatus.isGranted) { + return true; + } + + if (micStatus.isPermanentlyDenied) { + SmartDialog.showToast('请在系统设置中开启麦克风权限'); + await openAppSettings(); + } else { + SmartDialog.showToast('请允许麦克风权限以进入房间'); + } + return false; + } + Future leaveChannel() async { if (currentRole == CurrentRole.broadcaster) { try { diff --git a/lib/controller/message/call_controller.dart b/lib/controller/message/call_controller.dart index 9b9f798..d2a649c 100644 --- a/lib/controller/message/call_controller.dart +++ b/lib/controller/message/call_controller.dart @@ -236,6 +236,14 @@ class CallController extends GetxController { return false; } + // 先检查权限,没有权限不能进行下一步 + final type = callType == CallType.video ? 3 : 2; // 2=语音通话,3=视频通话 + final hasPermission = await _ensureCallPermissions(type); + if (!hasPermission) { + print('❌ [CallController] 权限检查失败,无法发起通话'); + return false; + } + // 检查是否在直播间 try { if (Get.isRegistered()) { @@ -259,7 +267,6 @@ class CallController extends GetxController { ); // 发起通话前,先创建一对一 RTC 频道 - final type = callType == CallType.video ? 3 : 2; // 1为音频,2为视频 final channelData = await createOneOnOneRtcChannel( type: type, toUserId: targetUserId, @@ -361,6 +368,14 @@ class CallController extends GetxController { '📞 [CallController] 接听${callType == CallType.video ? "视频" : "语音"}通话', ); + // 先检查权限,没有权限不能进行下一步 + final type = callType == CallType.video ? 3 : 2; // 2=语音通话,3=视频通话 + final hasPermission = await _ensureCallPermissions(type); + if (!hasPermission) { + print('❌ [CallController] 权限检查失败,无法接听通话'); + return false; + } + // 清空之前的远端用户UID和通话信息 remoteUid.value = null; _callChannelId = null; diff --git a/lib/pages/message/video_call_page.dart b/lib/pages/message/video_call_page.dart index 89bbc69..3e9edc0 100644 --- a/lib/pages/message/video_call_page.dart +++ b/lib/pages/message/video_call_page.dart @@ -585,9 +585,11 @@ class _VideoCallPageState extends State { return const SizedBox.shrink(); } - final availableBalance = consumeData?.availableBalance ?? 44; - final unitSellingBalance = consumeData?.unitSellingBalance ?? 35; - + final availableBalance = consumeData?.availableBalance ?? 0; + final unitSellingBalance = consumeData?.unitSellingBalance ?? 0; + if (availableBalance <= 0 && unitSellingBalance <= 0) { + return SizedBox(); + } return Center( child: Text( '玫瑰剩余$availableBalance支($unitSellingBalance玫瑰/分钟)',