Flutter视频会议插件custom_jitsi_meet_with_pointer的使用

Flutter视频会议插件custom_jitsi_meet_with_pointer的使用

Jitsi Meet 插件用于 Flutter。支持 Android、iOS 和 Web 平台。

“Jitsi Meet 是一个开源(Apache)WebRTC JavaScript 应用程序,使用 Jitsi Videobridge 提供高质量、安全且可扩展的视频会议。”

了解更多关于 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

在 Info.plist 中添加 NSCameraUsageDescription 和 NSMicrophoneUsageDescription。

<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

将构建工具 gradle 的依赖设置为至少 3.6.3:

dependencies {
    classpath 'com.android.tools.build:gradle:3.6.3' <!-- 升级这个 -->
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}

将分布 gradle 包装器设置为至少 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 并添加工具库和 tools:replace="android:label" 到 application 标签。

<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 文件,那么当你尝试加入会议或会议屏幕试图打开但立即关闭时,你的应用程序将会崩溃。你将在日志中看到以下错误之一。

## 应用崩溃 ##
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)
    .....
## 会议无法打开并返回到上一个屏幕 ##
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; // 限制视频分辨率为360p
	  
      var options = JitsiMeetingOptions()
        ..room = "myroom" // 必填,空格会被忽略
        ..serverURL = "https://someHost.com"
        ..subject = "Meeting with Gunschu"
        ..userDisplayName = "My Name"
        ..userEmail = "myemail@email.com"
        ..userAvatarURL = "https://someimageurl.com/image.jpg" // 或.png
        ..audioOnly = true
        ..audioMuted = true
        ..videoMuted = true
        ..featureFlag = featureFlag;

      await JitsiMeet.joinMeeting(options);
    } catch (error) {
      debugPrint("error: $error");
    }
  }

JitsiMeetingOptions

字段 是否必需 默认值 描述
room N/A 唯一房间名,会附加到 serverURL。有效字符:字母数字、破折号和下划线。
subject $room 会议名称显示在顶部。如果为空,则默认为房间名,其中破折号和下划线被替换为空格且首字母大写。
userDisplayName “Fellow Jitster” 用户显示名称。
userEmail none 用户电子邮件地址。
audioOnly false 开始会议时不带视频。可以在会议中启用。
audioMuted false 开始会议时静音音频。可以在会议中启用。
videoMuted false 开始会议时关闭视频。可以在会议中启用。
serverURL meet.jitsi.si 指定自己的托管服务器。必须是格式正确的绝对 URL,即 <scheme>://<host>[/path],例如 https://someHost.com。默认为 Jitsi Meet 的服务器。
userAvatarURL none 用户头像 URL。
token none 用于认证的 JWT 令牌。
featureFlag 见下文 FeatureFlag 类的对象,用于启用/禁用功能和设置 Jitsi Meet SDK 的视频分辨率。

FeatureFlag

功能标志允许你限制视频分辨率并启用/禁用 Jitsi Meet SDK 的一些功能。如果你不对 JitsiMeetingOptions 提供任何标志,将使用默认值。

我们正在使用官方的标志列表,取自 Jitsi Meet 存储库。

标志 默认(Android) 默认(iOS) 描述
addPeopleEnabled true true 启用蓝色按钮“添加人员”,当你单独通话时显示。 需要 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

字段 类型 描述
isSuccess bool 成功指示器。
message String 成功消息或错误。
error dynamic 可选,仅在 isSuccess 为 false 时存在。 错误对象。

监听会议事件

支持的事件

名称 描述
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");
  }));

全局会议事件

要监听全局会议事件,只需使用 <code>JitsiMeet.addListener(myListener)</code> 添加一个 JitsiMeetListener。你可以使用 <code>JitsiMeet.removeListener(listener)</code><code>JitsiMeet.removeAllListeners()</code> 来删除监听器。

@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视频会议插件custom_jitsi_meet_with_pointer的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter视频会议插件custom_jitsi_meet_with_pointer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


custom_jitsi_meet_with_pointer 是一个基于 Jitsi Meet 的 Flutter 插件,用于在 Flutter 应用中集成视频会议功能,并且支持鼠标指针的显示。以下是如何在 Flutter 项目中使用 custom_jitsi_meet_with_pointer 插件的详细步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 custom_jitsi_meet_with_pointer 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  custom_jitsi_meet_with_pointer: ^版本号

运行 flutter pub get 以安装依赖。

2. 配置 Android 和 iOS 项目

Android 配置

android/app/build.gradle 文件中,确保 minSdkVersion 至少为 21:

android {
    defaultConfig {
        minSdkVersion 21
    }
}

iOS 配置

ios/Podfile 中,确保 platform 设置为 :ios, '11.0'

platform :ios, '11.0'

然后运行 pod install 以更新 iOS 依赖。

3. 使用插件

初始化 Jitsi Meet

在 Flutter 项目中,首先导入插件并初始化 Jitsi Meet:

import 'package:custom_jitsi_meet_with_pointer/custom_jitsi_meet.dart';

加入视频会议

使用 CustomJitsiMeet.joinMeeting 方法加入视频会议:

void joinMeeting() async {
  try {
    var options = CustomJitsiMeetingOptions(
      roomName: 'your-room-name', // 会议室名称
      serverURL: 'https://meet.jit.si', // Jitsi 服务器地址
      subject: 'Meeting Subject', // 会议主题
      userDisplayName: 'Your Name', // 用户显示名称
      userEmail: 'your@email.com', // 用户邮箱
      userAvatarURL: 'https://your-avatar-url.com', // 用户头像 URL
      audioMuted: false, // 是否静音
      videoMuted: false, // 是否关闭视频
      isAudioOnly: false, // 是否仅音频
      isAudioMuted: false, // 是否静音
      isVideoMuted: false, // 是否关闭视频
      featureFlags: {
        'welcomepage.enabled': false, // 禁用欢迎页面
      },
    );

    await CustomJitsiMeet.joinMeeting(options);
  } catch (error) {
    print("Error: $error");
  }
}

监听会议事件

你可以通过 CustomJitsiMeet.addListener 来监听会议事件,例如会议结束、加入成功等:

CustomJitsiMeet.addListener(
  onConferenceWillJoin: (url) {
    print("Conference will join with url: $url");
  },
  onConferenceJoined: (url) {
    print("Conference joined with url: $url");
  },
  onConferenceTerminated: (url) {
    print("Conference terminated with url: $url");
  },
  onError: (error) {
    print("Error: $error");
  },
);

离开会议

你可以使用 CustomJitsiMeet.closeMeeting 来离开会议:

void leaveMeeting() {
  CustomJitsiMeet.closeMeeting();
}

4. 处理权限

确保在 Android 和 iOS 上请求必要的权限(如摄像头和麦克风权限)。

Android

AndroidManifest.xml 中添加以下权限:

<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.INTERNET" />

iOS

Info.plist 中添加以下权限:

<key>NSCameraUsageDescription</key>
<string>We need access to your camera for video calls.</string>
<key>NSMicrophoneUsageDescription</key>
<string>We need access to your microphone for audio calls.</string>
回到顶部