Flutter视频会议插件custom_jitsi_meet_test的使用

插件简介

custom_jitsi_meet_test 是一个用于在 Flutter 应用中集成 Jitsi Meet 视频会议功能的插件。它支持 Android、iOS 和 Web 平台。

支持我们

通过我们的 Patreon 账户支持我们: Patreon

更多信息

有关 Jitsi Meet 的更多信息,请访问 Jitsi Meet GitHub 仓库


目录

  1. 配置
  2. 加入会议
  3. 监听会议事件
  4. 程序化关闭会议
  5. 贡献

配置

IOS

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 文件中添加以下内容以请求相机和麦克风权限:

<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) MyApp 需要访问您的摄像头进行会议。</string>
<key>NSMicrophoneUsageDescription</key>
<string>$(PRODUCT_NAME) MyApp 需要访问您的麦克风进行会议。</string>

Android

Gradle

将构建工具依赖设置为最低 3.6.3:

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

将 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 中添加 tools 命名空间并替换 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

启用 Proguard 后,如果没有 proguard-rules.pro 文件,发布 APK 构建可能会丢失 Flutter Wrapper 和 React Native 代码。在 android/app/build.gradle 中添加 Proguard 支持:

buildTypes {
    release {
        // TODO: 添加您的签名配置以用于发布构建
        // 使用调试密钥进行签名以便运行 `flutter run --release`
        signingConfig signingConfigs.debug

        // 添加以下三行以启用 Proguard
        minifyEnabled true
        useProguard true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

然后在同一目录下创建一个名为 proguard-rules.pro 的文件,并粘贴示例应用中的内容。


Web

在 Web 端实现时,需要在 index.html 中包含 Jitsi JS 库:

<script src="https://meet.jit.si/external_api.js" type="application/javascript"></script>

示例:

<body>
  <!-- 此脚本安装 service_worker.js 以提供 PWA 功能 -->
  <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>

加入会议

以下是一个完整的示例代码,展示如何使用 custom_jitsi_meet_test 插件加入会议:

_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

以下是 JitsiMeetingOptions 的字段说明:

字段 是否必填 默认值 描述
room N/A 唯一房间名称,会附加到 serverURL 后面。有效字符:字母数字、破折号和下划线。
subject $room 会议名称,显示在会议顶部。如果为 null,则默认为房间名称,破折号和下划线替换为空格且首字母大写。
userDisplayName “Fellow Jitster” 用户显示名称。
userEmail none 用户电子邮件地址。
audioOnly false 仅音频会议,可以在会议中打开视频。
audioMuted false 开始会议时静音音频。
videoMuted false 开始会议时关闭视频。
serverURL meet.jitsi.si 指定自定义服务器。必须是有效的绝对 URL,例如 https://someHost.com
userAvatarURL none 用户头像 URL。
token none JWT 令牌,用于身份验证。
featureFlag 见下方 FeatureFlag 对象,用于启用或禁用功能并设置视频分辨率。

FeatureFlag

FeatureFlag 允许您限制视频分辨率并启用/禁用 Jitsi Meet SDK 的某些功能。


JitsiMeetingResponse

以下是 JitsiMeetingResponse 的字段说明:

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

监听会议事件

每场会议事件

在加入会议时传递 JitsiMeetingListener 来监听每场会议的事件:

await JitsiMeet.joinMeeting(options,
  listener: JitsiMeetingListener(onConferenceWillJoin: ({message}) {
    debugPrint("${options.room} 将加入,消息为: $message");
  }, onConferenceJoined: ({message}) {
    debugPrint("${options.room} 已加入,消息为: $message");
  }, onConferenceTerminated: ({message}) {
    debugPrint("${options.room} 已终止,消息为: $message");
  }, onPictureInPictureWillEnter: ({message}) {
    debugPrint("${options.room} 进入 PIP 模式,消息为: $message");
  }, onPictureInPictureTerminated: ({message}) {
    debugPrint("${options.room} 退出 PIP 模式,消息为: $message");
  }));

全局会议事件

通过 JitsiMeet.addListener 监听全局会议事件:

@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 广播了");
}

_onConferenceJoined({message}) {
  debugPrint("_onConferenceJoined 广播了");
}

_onConferenceTerminated({message}) {
  debugPrint("_onConferenceTerminated 广播了");
}

_onPictureInPictureWillEnter({message}) {
  debugPrint("_onPictureInPictureWillEnter 广播了,消息为: $message");
}

_onPictureInPictureTerminated({message}) {
  debugPrint("_onPictureInPictureTerminated 广播了,消息为: $message");
}

_onError(error) {
  debugPrint("_onError 广播了,错误为: $error");
}

程序化关闭会议

JitsiMeet.closeMeeting();

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

1 回复

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


custom_jitsi_meet_test 是一个基于 Jitsi Meet 的 Flutter 插件,用于在 Flutter 应用中集成视频会议功能。以下是如何使用 custom_jitsi_meet_test 插件的步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  custom_jitsi_meet_test: ^0.0.1  # 请使用最新版本

然后运行 flutter pub get 以获取依赖。

2. 配置 Android 和 iOS 项目

在 Android 和 iOS 项目中,确保你已经正确配置了必要的权限和设置。

Android

AndroidManifest.xml 文件中添加以下权限:

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

iOS

Info.plist 文件中添加以下权限:

<key>NSCameraUsageDescription</key>
<string>我们需要访问您的相机以进行视频通话。</string>
<key>NSMicrophoneUsageDescription</key>
<string>我们需要访问您的麦克风以进行音频通话。</string>

3. 使用插件

在你的 Flutter 代码中,你可以使用 custom_jitsi_meet_test 插件来启动视频会议。

import 'package:flutter/material.dart';
import 'package:custom_jitsi_meet_test/custom_jitsi_meet_test.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: VideoConferenceScreen(),
    );
  }
}

class VideoConferenceScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('视频会议'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            _joinMeeting();
          },
          child: Text('加入会议'),
        ),
      ),
    );
  }

  void _joinMeeting() async {
    try {
      var options = JitsiMeetingOptions(
        roomName: 'your_room_name', // 会议房间名称
        serverURL: 'https://meet.jit.si', // Jitsi Meet 服务器地址
        subject: '视频会议', // 会议主题
        userDisplayName: '用户', // 用户显示名称
        userEmail: 'user@example.com', // 用户邮箱
        audioMuted: false, // 是否静音
        videoMuted: false, // 是否关闭视频
      );

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

4. 处理会议事件

你可以监听会议事件,例如会议结束、用户加入或离开等。

CustomJitsiMeetTest.onConferenceWillJoin.listen((event) {
  print("会议即将加入: $event");
});

CustomJitsiMeetTest.onConferenceJoined.listen((event) {
  print("会议已加入: $event");
});

CustomJitsiMeetTest.onConferenceTerminated.listen((event) {
  print("会议已终止: $event");
});
回到顶部