Flutter视频会议插件jitsi_meet_v1的使用
Flutter视频会议插件jitsi_meet_v1的使用
支持我们使用我们的Patreon账户。
Jitsi Meet 插件用于 Flutter。支持 Android、iOS 和 Web 平台。
“Jitsi Meet 是一个开源(Apache)的 WebRTC JavaScript 应用程序,它使用 Jitsi Videobridge 提供高质量、安全且可扩展的视频会议。”
更多关于 Jitsi Meet 的信息可以在这里找到:Jitsi Meet
目录
配置
iOS
注意:示例可以在 XCode 12.2 和 Flutter 1.22.4 下编译。
Podfile
确保在您的 Podfile 中有类似以下的条目,声明平台为 11.0 或更高版本,并禁用 BITCODE。
platform :ios, '11.0'
...
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['ENABLE_BITCODE'] = 'NO'
end
end
end
Info.plist
将 NSCameraUsageDescription 和 NSMicrophoneUsageDescription 添加到您的 Info.plist。
<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) MyApp needs access to your camera for meetings.</string>
<key>NSMicrophoneUsageDescription</key>
<string>$(PRODUCT_NAME) MyApp needs access to your microphone for meetings.</string>
Android
Gradle
设置 build tools gradle 的依赖项至少为 3.6.3:
dependencies {
classpath 'com.android.tools.build:gradle:3.6.3' <!-- 升级此 -->
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
设置 distribution gradle wrapper 至少为 5.6.4。
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip <!-- 升级此 -->
AndroidManifest.xml
Jitsi Meet 的 SDK AndroidManifest.xml 会与您的项目冲突,尤其是 application:label 字段。要解决这个问题,进入 android/app/src/main/AndroidManifest.xml 并添加工具库和 application 标签中的 tools:replace=“android:label”。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="yourpackage.com"
xmlns:tools="http://schemas.android.com/tools"> <!-- 添加此 -->
<application
tools:replace="android:label"
android:name="your.application.name"
android:label="My Application"
android:icon="@mipmap/ic_launcher">
...
</application>
...
</manifest>
最低 SDK 版本 23
在 android/app/build.gradle 中更新您的最低 SDK 版本至 23。
defaultConfig {
applicationId "com.gunschu.jitsi_meet_example"
minSdkVersion 23 //Required for Jitsi
targetSdkVersion 28
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
Proguard
Jitsi 的 SDK 启用了 Proguard,但如果没有 proguard-rules.pro 文件,您的发布 apk 将缺少 Flutter 包装器和 react-native 代码。在您的 Flutter 项目的 android/app/build.gradle 文件中添加 Proguard 支持。
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
// Add below 3 lines for proguard
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
然后在同一目录下添加一个名为 proguard-rules.pro 的文件。参见示例应用的 proguard-rules.pro 文件以了解应粘贴的内容。
注意: 如果您不创建 proguard-rules.pro 文件,则尝试加入会议或会议屏幕尝试打开时应用程序会崩溃。您将在 logcat 中看到以下错误之一。
## App crashes ##
java.lang.RuntimeException: Parcel android.os.Parcel@8530c57: Unmarshalling unknown type code 7536745 at offset 104
at android.os.Parcel.readValue(Parcel.java:2747)
at android.os.Parcel.readSparseArrayInternal(Parcel.java:3118)
at android.os.Parcel.readSparseArray(Parcel.java:2351)
.....
## Meeting won't open and you go to previous screen ##
W/unknown:ViewManagerPropertyUpdater: Could not find generated setter for class com.BV.LinearGradient.LinearGradientManager
W/unknown:ViewManagerPropertyUpdater: Could not find generated setter for class com.facebook.react.uimanager.g
W/unknown:ViewManagerPropertyUpdater: Could not find generated setter for class com.facebook.react.views.art.ARTGroupViewManager
W/unknown:ViewManagerPropertyUpdater: Could not find generated setter for class com.facebook.react.views.art.a
.....
WEB
要实现它,需要在 web 部分的 index.html 中包含 Jitsi Js 库。
<script src="https://meet.jit.si/external_api.js" type="application/javascript"></script>
示例:
<body>
<!-- This script installs service_worker.js to provide PWA functionality to
application. For more information, see:
https://developers.google.com/web/fundamentals/primers/service-workers -->
<script>
if ('serviceWorker' in navigator) {
window.addEventListener('load', function () {
navigator.serviceWorker.register('/flutter_service_worker.js');
});
}
</script>
<script src="https://meet.jit.si/external_api.js" type="application/javascript"></script>
<script src="main.dart.js" type="application/javascript"></script>
</body>
</html>
注意: 查看 jitsi_meet 插件中的使用示例
加入会议
_joinMeeting() async {
try {
FeatureFlag featureFlag = FeatureFlag();
featureFlag.welcomePageEnabled = false;
featureFlag.resolution = FeatureFlagVideoResolution.MD_RESOLUTION; // Limit video resolution to 360p
var options = JitsiMeetingOptions()
..room = "myroom" // Required, spaces will be trimmed
..serverURL = "https://someHost.com"
..subject = "Meeting with Gunschu"
..userDisplayName = "My Name"
..userEmail = "myemail@email.com"
..userAvatarURL = "https://someimageurl.com/image.jpg" // or .png
..audioOnly = true
..audioMuted = true
..videoMuted = true
..featureFlag = featureFlag;
await JitsiMeet.joinMeeting(options);
} catch (error) {
debugPrint("error: $error");
}
}
JitsiMeetingOptions
Field | Required | Default | Description |
---|---|---|---|
room | Yes | N/A | 唯一的房间名称,将附加到 serverURL。有效字符:字母数字、破折号和下划线。 |
subject | No | $room | 会议名称显示在会议顶部。如果为 null,则默认为房间名称,其中破折号和下划线被替换为空格并首字母大写。 |
userDisplayName | No | “Fellow Jitster” | 用户的显示名称。 |
userEmail | No | none | 用户的电子邮件地址。 |
audioOnly | No | false | 开始会议时不使用视频。可以在会议中打开。 |
audioMuted | No | false | 开始会议时音频静音。可以在会议中打开。 |
videoMuted | No | false | 开始会议时视频静音。可以在会议中打开。 |
serverURL | No | meet.jitsi.si | 指定自己的托管服务器。必须是一个有效的绝对 URL,格式为 <scheme>://<host>[/path] ,例如 https://someHost.com。默认为 Jitsi Meet 的服务器。 |
userAvatarURL | N/A | none | 用户的头像 URL。 |
token | N/A | none | 用于身份验证的 JWT 令牌。 |
featureFlag | No | see below | FeatureFlag 类的对象,用于启用/禁用功能并设置 Jitsi Meet SDK 的视频分辨率。 |
FeatureFlag
特征标志允许您限制视频分辨率并启用/禁用 Jitsi Meet SDK 的一些功能。如果您不对 JitsiMeetingOptions 提供任何标志,默认值将被使用。
我们使用的是 官方列表中的标志。
Flag | Default (Android) | Default (iOS) | Description |
---|---|---|---|
addPeopleEnabled | true | true | 启用蓝色按钮“Add people”,当您单独通话时出现。需要启用 inviteEnabled。 |
calendarEnabled | true | auto | 启用日历集成。 |
callIntegrationEnabled | true | true | 启用呼叫集成(iOS 上的 CallKit,Android 上的 ConnectionService)。注意 |
closeCaptionsEnabled | true | true | 启用菜单中的字幕选项。 |
conferenceTimerEnabled | true | true | 启用会议计时器。 |
chatEnabled | true | true | 启用聊天(按钮和功能)。 |
inviteEnabled | true | true | 启用菜单中的邀请选项。 |
iOSRecordingEnabled | N/A | false | 在 iOS 上启用录制。 |
kickOutEnabled | true | true | 启用参与者视频缩略图中的踢出选项。 |
liveStreamingEnabled | auto | auto | 启用菜单中的直播流选项。 |
meetingNameEnabled | true | true | 显示会议名称。 |
meetingPasswordEnabled | true | true | 启用菜单中的会议密码选项(如果设置了会议密码,对话框仍然会出现)。 |
pipEnabled | auto | auto | 启用画中画模式。 |
raiseHandEnabled | true | true | 启用菜单中的举手选项。 |
recordingEnabled | auto | N/A | 启用菜单中的录制选项。 |
resoulution | N/A | N/A | 设置本地和(最大)远程视频分辨率。覆盖服务器配置。接受的值为:LD_RESOLUTION 为 180p,MD_RESOLUTION 为 360p,SD_RESOLUTION 为 480p(SD),HD_RESOLUTION 为 720p(HD)。 |
serverURLChangeEnabled | true | true | 启用服务器 URL 更改。 |
tileViewEnabled | true | true | 启用菜单中的平铺视图选项。 |
toolboxAlwaysVisible | true | true | 工具箱(按钮和菜单)在通话期间始终可见(如果不这样,单击即可显示)。 |
videoShareButtonEnabled | true | true | 启用视频共享按钮。 |
welcomePageEnabled | false | false | 启用欢迎页面。“欢迎页面列出了最近的会议和日历约会,旨在用于独立应用程序。” |
注意:关于呼叫集成。Android 上的呼叫集成(称为 ConnectionService)由于造成许多问题而被官方 Jitsi Meet 应用禁用。您也应该禁用它以避免这些问题。
JitsiMeetingResponse
Field | Type | Description |
---|---|---|
isSuccess | bool | 成功指示器。 |
message | String | 成功消息或错误作为字符串。 |
error | dynamic | 可选,仅在 isSuccess 为 false 时存在。错误对象。 |
监听会议事件
支持的事件
Name | Description |
---|---|
onConferenceWillJoin | 会议正在加载。 |
onConferenceJoined | 用户已加入会议。 |
onConferenceTerminated | 用户已退出会议。 |
onPictureInPictureWillEnter | 用户进入画中画模式。 |
onPictureInPictureTerminated | 用户退出画中画模式。 |
onError | 发生了监听会议事件的错误。 |
每场会议的事件
要监听每场会议的事件,在加入会议时传递一个 JitsiMeetingListener。当触发 onConferenceTerminated 事件时,监听器将自动移除。
await JitsiMeet.joinMeeting(options,
listener: JitsiMeetingListener(onConferenceWillJoin: ({message}) {
debugPrint("${options.room} will join with message: $message");
}, onConferenceJoined: ({message}) {
debugPrint("${options.room} joined with message: $message");
}, onConferenceTerminated: ({message}) {
debugPrint("${options.room} terminated with message: $message");
}, onPictureInPictureWillEnter: ({message}) {
debugPrint("${options.room} entered PIP mode with message: $message");
}, onPictureInPictureTerminated: ({message}) {
debugPrint("${options.room} exited PIP mode with message: $message");
}));
全局会议事件
要监听全局会议事件,只需使用 JitsiMeet.addListener 添加一个 JitsiMeetingListener。您可以使用 JitsiMeet.removeListener 或 JitsiMeet.removeAllListeners 来移除监听器。
@override
void initState() {
super.initState();
JitsiMeet.addListener(JitsiMeetingListener(
onConferenceWillJoin: _onConferenceWillJoin,
onConferenceJoined: _onConferenceJoined,
onConferenceTerminated: _onConferenceTerminated,
onPictureInPictureWillEnter: _onPictureInPictureWillEnter,
onPictureInPictureTerminated: _onPictureInPictureTerminated,
onError: _onError));
}
@override
void dispose() {
super.dispose();
JitsiMeet.removeAllListeners();
}
_onConferenceWillJoin({message}) {
debugPrint("_onConferenceWillJoin broadcasted");
}
_onConferenceJoined({message}) {
debugPrint("_onConferenceJoined broadcasted");
}
_onConferenceTerminated({message}) {
debugPrint("_onConferenceTerminated broadcasted");
}
_onPictureInPictureWillEnter({message}) {
debugPrint("_onPictureInPictureWillEnter broadcasted with message: $message");
}
_onPictureInPictureTerminated({message}) {
debugPrint("_onPictureInPictureTerminated broadcasted with message: $message");
}
_onError(error) {
debugPrint("_onError broadcasted");
}
程序化关闭会议
JitsiMeet.closeMeeting();
更多关于Flutter视频会议插件jitsi_meet_v1的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter视频会议插件jitsi_meet_v1的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中集成和使用 jitsi_meet_v1
插件来启动 Jitsi Meet 视频会议的示例代码。
1. 添加依赖
首先,你需要在你的 pubspec.yaml
文件中添加 jitsi_meet_v1
依赖:
dependencies:
flutter:
sdk: flutter
jitsi_meet_v1: ^x.y.z # 请将 x.y.z 替换为当前最新版本号
然后运行 flutter pub get
来获取依赖。
2. 导入插件
在你需要使用 Jitsi Meet 的 Dart 文件中导入插件:
import 'package:jitsi_meet_v1/jitsi_meet_v1.dart';
3. 配置 Jitsi Meet
在 Flutter 项目中配置 Jitsi Meet,包括设置 URL 和其他可选参数。以下是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:jitsi_meet_v1/jitsi_meet_v1.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Jitsi Meet Example'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
_launchJitsiMeet();
},
child: Text('Join Meeting'),
),
),
),
);
}
void _launchJitsiMeet() {
final options = JitsiMeetOptions(
room: 'https://meet.jit.si/YourMeetingRoomName', // 替换为你的会议URL
userName: 'YourUserName', // 可选参数,设置用户名称
userInfo: Map<String, String>.fromEntries([
MapEntry('email', 'user@example.com'), // 可选参数,设置用户信息
]),
audioOnly: false, // 可选参数,是否为仅音频模式
interfaceConfig: Map<String, dynamic>.fromEntries([
MapEntry('TOOLBAR_BUTTONS', [
'microphone',
'camera',
'hangup',
]),
]),
);
JitsiMeet.launch(options);
}
}
4. 运行应用
确保你的 Flutter 环境配置正确,然后运行应用:
flutter run
现在,当你点击 “Join Meeting” 按钮时,应用会启动 Jitsi Meet 视频会议。
注意事项
- 权限:确保你的应用具有访问互联网和相机/麦克风的权限。
- Jitsi Meet 服务器:你可以使用 Jitsi Meet 的公共服务器
meet.jit.si
,或者你可以自己部署 Jitsi Meet 服务器。 - 自定义:你可以根据需要进一步自定义
JitsiMeetOptions
,比如设置主题、工具栏按钮等。
这样,你就成功地在 Flutter 应用中集成了 jitsi_meet_v1
插件,并可以启动 Jitsi Meet 视频会议了。