Flutter集成Jitsi Meet遇问题:无法创建会议,需等待主持人或登录
Flutter集成Jitsi Meet创建会议提示“等待主持人”/“登录”问题解决
核心问题原因
当前配置下,meet.jit.si的默认房间规则会要求主持人权限,且未设置让第一个进入的用户自动获取主持人身份;“登录”提示大概率是房间访客权限未放开,或者用户信息传递不完整导致的。
分步解决
1. 生成随机会议ID
固定房间名容易触发权限冲突,直接生成随机8位字母数字组合作为房间ID:
// 生成随机会议ID String generateRandomRoomId() { const chars = 'abcdefghijklmnopqrstuvwxyz0123456789'; return List.generate(8, (index) => chars[Random().nextInt(chars.length)]).join(); }
2. 配置会议权限,自动赋予创建者主持人身份
修改JitsiMeetConferenceOptions的配置,重点添加主持人权限和访客允许规则:
var options = JitsiMeetConferenceOptions( serverURL: "https://meet.jit.si", room: roomName, configOverrides: { "startWithAudioMuted": isAudioMuted, "startWithVideoMuted": isVideoMuted, "subject": "Jitsi With Flutter", // 关闭欢迎页和预加入页,直接进入会议 "disableWelcomePage": true, "prejoinPageEnabled": false, // 让第一个进入的用户自动成为主持人 "startHosting": true, "requireDisplayName": true, // 允许访客直接加入,不需要登录 "guestPolicy": "ALWAYS_ALLOW", }, featureFlags: { "unsaferoomwarning.enabled": false, "welcomepage.enabled": false, // 开启主持人控制权限 "enableHostControls": true, // 允许访客加入会议 "guestCanJoin": true, }, userInfo: JitsiMeetUserInfo( displayName: name, email: _authMethods.user.email, ), );
3. 完善用户信息处理
避免因用户displayName为空导致的权限问题,添加默认值:
String name = username.isNotEmpty ? username : (_authMethods.user.displayName ?? 'Guest');
4. 检查Android端配置
确保AndroidManifest.xml里的权限和meta-data配置完整:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <meta-data android:name="org.jitsi.meet.CONFIG_URL" android:value="https://meet.jit.si/config.js" />
完整修改后的代码
import 'dart:math'; import 'package:../resources/auth_methods.dart'; import 'package:../resources/firestore_methods.dart'; import 'package:jitsi_meet_flutter_sdk/jitsi_meet_flutter_sdk.dart'; class JitsiMeetMethods { final AuthMethods _authMethods = AuthMethods(); final FirestoreMethods _firestoreMethods = FirestoreMethods(); // 生成随机8位会议ID String generateRandomRoomId() { const chars = 'abcdefghijklmnopqrstuvwxyz0123456789'; return List.generate(8, (index) => chars[Random().nextInt(chars.length)]).join(); } void createMeeting( {required bool isAudioMuted, required bool isVideoMuted, String username = ''}) async { try { var jitsiMeet = JitsiMeet(); String name = username.isNotEmpty ? username : (_authMethods.user.displayName ?? 'Guest'); String roomName = generateRandomRoomId(); var options = JitsiMeetConferenceOptions( serverURL: "https://meet.jit.si", room: roomName, configOverrides: { "startWithAudioMuted": isAudioMuted, "startWithVideoMuted": isVideoMuted, "subject": "Jitsi With Flutter", "disableWelcomePage": true, "prejoinPageEnabled": false, "startHosting": true, "requireDisplayName": true, "guestPolicy": "ALWAYS_ALLOW", }, featureFlags: { "unsaferoomwarning.enabled": false, "welcomepage.enabled": false, "enableHostControls": true, "guestCanJoin": true, }, userInfo: JitsiMeetUserInfo( displayName: name, email: _authMethods.user.email, ), ); _firestoreMethods.addToMeetingHistory(roomName); await jitsiMeet.join(options); } catch (err) { print("Error:$err"); } } }
内容的提问来源于stack exchange,提问作者Samarth
相关产品推荐
相关产品推荐

