You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
3.1 KiB
96 lines
3.1 KiB
import 'package:agora_token_generator/agora_token_generator.dart';
|
|
import 'package:dating_touchme_app/model/rtc/rtc_channel_data.dart';
|
|
import 'package:dating_touchme_app/network/network_service.dart';
|
|
import 'package:dating_touchme_app/rtc/rtc_manager.dart';
|
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
|
import 'package:get/get.dart';
|
|
import 'package:get_storage/get_storage.dart';
|
|
import 'package:permission_handler/permission_handler.dart';
|
|
|
|
/// 直播房间相关控制器
|
|
class RoomController extends GetxController {
|
|
RoomController({NetworkService? networkService})
|
|
: _networkService = networkService ?? Get.find<NetworkService>();
|
|
|
|
final NetworkService _networkService;
|
|
|
|
/// 当前频道信息
|
|
final Rxn<RtcChannelData> rtcChannel = Rxn<RtcChannelData>();
|
|
|
|
/// 是否正在创建
|
|
final RxBool isLoading = false.obs;
|
|
|
|
/// 调用接口创建 RTC 频道
|
|
Future<void> createRtcChannel() async {
|
|
if (isLoading.value) return;
|
|
final granted = await _ensureRtcPermissions();
|
|
if (!granted) return;
|
|
|
|
try {
|
|
isLoading.value = true;
|
|
final response = await _networkService.rtcApi.createRtcChannel();
|
|
final base = response.data;
|
|
if (base.isSuccess && base.data != null) {
|
|
rtcChannel.value = base.data;
|
|
GetStorage storage = GetStorage();
|
|
String userId = storage.read('userId') ?? '';
|
|
String tokens = RtmTokenBuilder.buildToken(
|
|
appId: '4c2ea9dcb4c5440593a418df0fdd512d',
|
|
appCertificate: '16f34b45181a4fae8acdb1a28762fcfa',
|
|
userId: userId,
|
|
tokenExpireSeconds: 3600,
|
|
);
|
|
await _joinRtcChannel(base.data!.token, base.data!.channelId, base.data!.uid);
|
|
} else {
|
|
final message = base.message.isNotEmpty ? base.message : '创建频道失败';
|
|
SmartDialog.showToast(message);
|
|
}
|
|
} catch (e) {
|
|
SmartDialog.showToast('创建频道异常:$e');
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
}
|
|
Future<void> _joinRtcChannel(
|
|
String token,
|
|
String channelName,
|
|
int uid,
|
|
) async {
|
|
try {
|
|
await RTCManager.instance.joinChannel(
|
|
token: token,
|
|
channelId: channelName,
|
|
uid: uid,
|
|
);
|
|
} catch (e) {
|
|
SmartDialog.showToast('加入频道失败:$e');
|
|
}
|
|
}
|
|
|
|
Future<void> sendMessage(String message) async {
|
|
await RTCManager.instance.sendMessage(message);
|
|
}
|
|
|
|
Future<bool> _ensureRtcPermissions() async {
|
|
final statuses = await [Permission.camera, Permission.microphone].request();
|
|
final allGranted = statuses.values.every((status) => status.isGranted);
|
|
if (allGranted) {
|
|
return true;
|
|
}
|
|
|
|
final permanentlyDenied =
|
|
statuses.values.any((status) => status.isPermanentlyDenied);
|
|
if (permanentlyDenied) {
|
|
SmartDialog.showToast('请在系统设置中开启摄像头和麦克风权限');
|
|
await openAppSettings();
|
|
} else {
|
|
SmartDialog.showToast('请允许摄像头和麦克风权限以进入房间');
|
|
}
|
|
return false;
|
|
}
|
|
|
|
Future<void> disposeRtcResources() async {
|
|
await RTCManager.instance.dispose();
|
|
}
|
|
}
|
|
|