1.进入会议后,将获取token接口调整到第一顺序

2.初始化声网SDK,调用SDK加入会议室
This commit is contained in:
fuenmao 2024-11-26 17:22:29 +08:00
parent 68e8c5c1c9
commit 15321c4d61
4 changed files with 104 additions and 21 deletions

View File

@ -16,7 +16,7 @@ class HomeLogic extends GetxController with RequestToolMixin {
} }
/// ///
void doHttpGetMeetingRoomList(int pageIndex, int pageSize) async { Future<void> doHttpGetMeetingRoomList(int pageIndex, int pageSize) async {
BaseStructureResult<MeetingRoomItem> res = await getClient().getMeetingRoomList(pageIndex,pageSize); BaseStructureResult<MeetingRoomItem> res = await getClient().getMeetingRoomList(pageIndex,pageSize);
if(null != res.data){ if(null != res.data){
if(state.pageIndex == 1){ if(state.pageIndex == 1){

View File

@ -26,7 +26,7 @@ class LoginLogic extends GetxController with RequestToolMixin {
} }
/// ///
void doHttpLogin() async { Future<void> doHttpLogin() async {
if(state.userNameController.text.isEmpty){ if(state.userNameController.text.isEmpty){
ToastUtils.showError("请输入账号"); ToastUtils.showError("请输入账号");
}else if(state.passwordController.text.isEmpty){ }else if(state.passwordController.text.isEmpty){
@ -46,7 +46,7 @@ class LoginLogic extends GetxController with RequestToolMixin {
} }
/// ///
void doHttpAnonymousLogin() async { Future<void> doHttpAnonymousLogin() async {
if(state.meetingCodeController.text.isEmpty){ if(state.meetingCodeController.text.isEmpty){
ToastUtils.showError("请输入会议号"); ToastUtils.showError("请输入会议号");
}else if(state.meetingCodeController.text.length != 8){ }else if(state.meetingCodeController.text.length != 8){

View File

@ -1,6 +1,9 @@
import 'dart:async'; import 'dart:async';
import 'package:agora_rtc_engine/agora_rtc_engine.dart';
import 'package:flutter/foundation.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:signalr_core/signalr_core.dart'; import 'package:signalr_core/signalr_core.dart';
import 'package:wgshare/common/store/user_store.dart'; import 'package:wgshare/common/store/user_store.dart';
@ -16,14 +19,14 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
final MeetingMainState state = MeetingMainState(); final MeetingMainState state = MeetingMainState();
@override @override
void onInit() async { void onInit() {
super.onInit(); super.onInit();
// //
var data = Get.arguments; var data = Get.arguments;
state.roomNumber.value = data["roomNumber"]; state.roomNumber.value = data["roomNumber"];
signalRSocket(); doHttpGetMeetingToken();
} }
@override @override
@ -31,24 +34,22 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
super.onClose(); super.onClose();
state.memberNameSearchController.dispose(); state.memberNameSearchController.dispose();
stopTime(); stopTime();
leaveMeeting();
state.hubConnection.value?.stop(); state.hubConnection.value?.stop();
} }
/// ///
/// 1. /// 1.
/// 2. /// 2.
/// 3.Token Future<void> mergeFetch() async {
void mergeFetch() async {
ToastUtils.showLoading(); ToastUtils.showLoading();
var results = await Future.wait([ var results = await Future.wait([
getClient().getMeetingRoomInfo(state.roomNumber.value), getClient().getMeetingRoomInfo(state.roomNumber.value),
getClient().getMeetingRoomAllUser(state.roomNumber.value), getClient().getMeetingRoomAllUser(state.roomNumber.value)]);
getClient().getMeetingToken(state.roomNumber.value)]);
doHttpGetMeetingRoomInfo(results[0].data as MeetingRoomInfo); getMeetingRoomInfo(results[0].data as MeetingRoomInfo);
doHttpGetMeetingRoomAllUser(results[1].data as List<MeetingRoomUser>); getMeetingRoomAllUser(results[1].data as List<MeetingRoomUser>);
doHttpGetMeetingToken(results[2].data as String);
ToastUtils.dismiss(); ToastUtils.dismiss();
} }
@ -64,11 +65,11 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
await state.hubConnection.value?.start(); await state.hubConnection.value?.start();
joinChannel(); joinChannelToSocket();
} }
/// ///
void joinChannel() async { Future<void> joinChannelToSocket() async {
await state.hubConnection.value?.invoke("joinChannel", args: [state.roomNumber.value, false, false, false]); await state.hubConnection.value?.invoke("joinChannel", args: [state.roomNumber.value, false, false, false]);
mergeFetch(); mergeFetch();
} }
@ -89,20 +90,24 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
} }
/// ///
void doHttpGetMeetingRoomInfo(MeetingRoomInfo meetingRoomInfo) async { void getMeetingRoomInfo(MeetingRoomInfo meetingRoomInfo) async {
state.meetingRoomInfo.value = meetingRoomInfo; state.meetingRoomInfo.value = meetingRoomInfo;
startTime(); startTime();
} }
/// ///
void doHttpGetMeetingRoomAllUser(List<MeetingRoomUser> meetingRoomUsers) async { void getMeetingRoomAllUser(List<MeetingRoomUser> meetingRoomUsers) async {
state.users.value = meetingRoomUsers; state.users.value = meetingRoomUsers;
state.cacheUsers.value = meetingRoomUsers; state.cacheUsers.value = meetingRoomUsers;
} }
/// Token /// Token
void doHttpGetMeetingToken(String meetingToken) async { Future<void> doHttpGetMeetingToken() async {
state.meetingToken.value = meetingToken; BaseStructureResult<String> res = await getClient().getMeetingToken(state.roomNumber.value);
state.meetingToken.value = res.data!;
initRtc();
signalRSocket();
} }
/// ///
@ -141,4 +146,69 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
state.users.value = state.cacheUsers.value; state.users.value = state.cacheUsers.value;
} }
} }
/// SDK
Future<void> initRtc() async {
//
if (defaultTargetPlatform == TargetPlatform.android) {
await [Permission.microphone].request();
}
// RtcEngine
state.rctEngine.value = createAgoraRtcEngine();
// RtcEngine channelProfileLiveBroadcasting
await state.rctEngine.value?.initialize(RtcEngineContext(
appId: state.appId,
channelProfile: ChannelProfileType.channelProfileLiveBroadcasting,
));
joinChannelToRtc();
//
state.rctEngine.value?.registerEventHandler(
RtcEngineEventHandler(
//
onJoinChannelSuccess: (RtcConnection connection, int elapsed) {
debugPrint("自己加入会议室ID${connection.localUid}");
},
//
onUserJoined: (RtcConnection connection, int remoteUid, int elapsed) {
debugPrint("远端用户或主播加入会议室用户或主机的ID$remoteUid");
},
//
onUserOffline: (RtcConnection connection, int remoteUid, UserOfflineReasonType reason) {
debugPrint("远端用户或主播离开会议室用户或主机的ID$remoteUid");
},
),
);
}
///
Future<void> joinChannelToRtc() async {
await state.rctEngine.value?.joinChannel(
token: state.meetingToken.value,
channelId: state.roomNumber.value,
uid: 0,
options: const ChannelMediaOptions(
//
autoSubscribeVideo: false,
//
autoSubscribeAudio: true,
//
publishCameraTrack: false,
//
publishMicrophoneTrack: false,
// clientRoleAudience
clientRoleType: ClientRoleType.clientRoleAudience),
);
}
///
Future<void> leaveMeeting() async {
//
await state.rctEngine.value?.leaveChannel();
//
await state.rctEngine.value?.release();
}
} }

View File

@ -1,5 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'package:agora_rtc_engine/agora_rtc_engine.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:get/get_rx/src/rx_types/rx_types.dart'; import 'package:get/get_rx/src/rx_types/rx_types.dart';
@ -30,6 +31,9 @@ class MeetingMainState {
/// ///
late RxString roomNumber = "".obs; late RxString roomNumber = "".obs;
/// token
late RxString meetingToken = "".obs;
/// ///
late Rx<MeetingRoomInfo?> meetingRoomInfo = Rx(null); late Rx<MeetingRoomInfo?> meetingRoomInfo = Rx(null);
@ -45,10 +49,19 @@ class MeetingMainState {
/// ///
late RxList<MeetingRoomUser> cacheUsers = RxList([]); late RxList<MeetingRoomUser> cacheUsers = RxList([]);
/// Token
late RxString meetingToken = "".obs;
/// signalR /// signalR
late RxString serviceUrl = "http://192.168.2.9:5192/session-manage".obs; late RxString serviceUrl = "http://192.168.2.9:5192/session-manage".obs;
late Rx<HubConnection?> hubConnection = Rx(null); late Rx<HubConnection?> hubConnection = Rx(null);
///
final String appId = "4a4f7be64fa1404ebda74784fe9ac381";
late Rx<RtcEngine?> rctEngine = Rx(null);
///
late RxBool isAutoSubscribeVideo = false.obs;
///
late RxBool isAutoSubscribeAudio = false.obs;
///
late RxBool isPublishCameraTrack = false.obs;
///
late RxBool isPublishMicrophoneTrack = false.obs;
} }