gyanmeet_flutter_sdk 1.3.7
gyanmeet_flutter_sdk: ^1.3.7 copied to clipboard
Gyanmeet meeting SDK for Flutter — a self-contained video meeting widget with host controls, chat, polls, and optional on-device AI proctoring.
gyanmeet_flutter_sdk #
A self-contained Flutter meeting widget for Gyanmeet. Drop a single widget into your app to get the full Gyanmeet meeting experience — video grid, host controls, chat, polls, and optional on-device AI proctoring.
The consumer embeds one widget. No API key ever lives in the client: your backend mints a short-lived external-join token, and the SDK performs the validate-join round-trip itself.
Usage #
import 'package:gyanmeet_flutter_sdk/gyanmeet_flutter_sdk.dart';
GyanmeetMeeting(
backendUrl: 'https://your.gyanmeet.com/api', // REST base
token: externalJoinToken, // minted by YOUR backend
config: const GyanmeetConfig(
chatMode: ChatMode.open, // or hostModerated
videoMode: VideoMode.all, // or hostsOnly
showParticipantsTab: true,
showPolls: true, // show/hide the Polls button for all
allowPoll: false, // let attendees create polls (hosts always can)
showHeader: true, // show/hide the top meeting header
showPreJoin: true,
initialAudio: true,
initialVideo: true,
waitingOverlayText: 'Waiting for others…', // optional text under the join spinner
enableAiMonitoring: true, // Enables on-device Face & Gaze detection
),
primaryColor: '#366D5A', // optional brand theming
onJoined: (meetingId, role) {},
onLeave: () {}, // local user left
onEnded: () {}, // host ended for everyone
onError: (error) {},
onFacePresenceChanged: (isPresent) {}, // emitted when face appears/disappears
onGazeViolation: (reason) {}, // emitted for looking away/up/down
)
chat is a server meeting-setting the host toggles live in-meeting; polls are always available.
Features #
- Join flow with optional PreJoin device check.
- Video grid + pagination, debounced active-speaker pin, fullscreen tap.
- Mic / camera / screen-share toggles, hand raise.
- Host controls: mute / disable video & audio, promote/demote, remove, end meeting, live chat toggle.
- Chat (open + host-moderated), participants panel, polls (create/vote/results).
- Adaptive bandwidth: only the visible page and active speaker are subscribed, screen-share is always subscribed, and your upload is paused when no one is viewing you.
- AI Monitoring: optional built-in on-device proctoring — face presence, gaze (exam mode), and identity verification — all running on-device.
AI Monitoring & proctoring #
When the server enables AI monitoring for a meeting, the SDK runs on-device checks and reports violations. Nothing is enforced automatically — you decide what to do in your handlers (log, warn, end meeting, report to your backend).
Use the unified handler, the type-specific ones, or both (all fire):
GyanmeetMeeting(
// one place for every violation kind
onProctoringViolation: (v) {
switch (v.type) {
case ProctoringViolationType.identity: // v.similarity set
case ProctoringViolationType.gaze: // v.reason: looking_far_*
case ProctoringViolationType.faceAbsence:
}
},
// or react to specific ones
onFacePresenceChanged: (present) {},
onGazeViolation: (reason) {},
onIdentityMismatch: (similarity) {},
)
Identity verification #
Confirms the live face is the same person throughout. The first detected face is
enrolled as a baseline; later frames are compared (cosine similarity) and
onIdentityMismatch / a ProctoringViolation(type: identity) fires after a
sustained mismatch.
A MobileFaceNet model ships with the SDK, so this works out of the box — no consumer setup. Tune or replace via config:
GyanmeetConfig(
// override with your own asset, or set null to disable identity checks
faceModelAssetPath: GyanmeetConfig.defaultFaceModelAssetPath,
faceMatchThreshold: 0.6, // lower = more permissive
)
The bundled model is MobileFaceNet (BSD-3-Clause, © 2020 Marcos Carlomagno);
see assets/models/mobilefacenet.LICENSE.
Platform setup #
The meeting needs camera/mic permissions, and screen share needs extra native plumbing.
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.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
The MediaProjection foreground service used for screen share is provided internally by the SDK — no extra wiring required.
iOS #
Info.plist:
<key>NSCameraUsageDescription</key>
<string>Camera access for video meetings.</string>
<key>NSMicrophoneUsageDescription</key>
<string>Microphone access for audio in meetings.</string>
Screen-share publishing on iOS additionally requires a Broadcast Upload Extension + an App Group (registered under your Apple Developer account). Screen-share viewing works without it.
Release IPA builds (flutter build ipa): identity verification uses TF Lite,
whose symbols Xcode strips by default, causing Failed to lookup symbol. Fix in
Xcode → target Runner → Build Settings → Strip Style → change
All Symbols to Non-Global Symbols. Android needs no change.