Browse Source

fix(call): 添加通话权限检查机制

- 在发起和接听通话前添加权限检查,确保有相应权限才能进行通话
- 根据通话类型区分视频通话(3)和语音通话(2)的权限验证
- 修复直播间上麦权限检查逻辑,区分嘉宾和普通观众的不同权限需求
- 为普通观众上麦单独实现麦克风权限检查方法
- 修复余额显示逻辑,当可用余额和单位销售余额都为0时隐藏余额显示
master
Jolie 2 months ago
parent
commit
85d5fee012
3 changed files with 50 additions and 6 deletions
  1. 31
      lib/controller/discover/room_controller.dart
  2. 17
      lib/controller/message/call_controller.dart
  3. 8
      lib/pages/message/video_call_page.dart

31
lib/controller/discover/room_controller.dart

@ -238,8 +238,19 @@ class RoomController extends GetxController with WidgetsBindingObserver {
}
Future<void> 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<bool> _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<void> leaveChannel() async {
if (currentRole == CurrentRole.broadcaster) {
try {

17
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<RoomController>()) {
@ -259,7 +267,6 @@ class CallController extends GetxController {
);
// RTC
final type = callType == CallType.video ? 3 : 2; // 12
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;

8
lib/pages/message/video_call_page.dart

@ -585,9 +585,11 @@ class _VideoCallPageState extends State<VideoCallPage> {
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玫瑰/分钟)',

Loading…
Cancel
Save