gyanmeet_flutter_sdk 1.4.0 copy "gyanmeet_flutter_sdk: ^1.4.0" to clipboard
gyanmeet_flutter_sdk: ^1.4.0 copied to clipboard

unlisted

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. The SDK itself enforces nothing — you decide what to do in your handlers (log, warn, end meeting, report to your backend).

Backends that implement the AI violation policy are the exception: there the server counts violations and removes the participant itself. See Server-enforced removal below.

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) {},
)

Server-enforced removal #

Some backends run a default AI violation policy: face-absence and identity mismatch feed one shared warning counter, and the participant is removed once the warnings run out. Removal is sticky — they cannot rejoin the meeting, or any other meeting in the same batch, without re-registering.

The SDK detects support automatically. Against a backend without the policy these callbacks never fire and nothing is reported, so no consumer change is needed either way.

GyanmeetMeeting(
  onAiViolationWarning: (v) {
    // v.message carries the server's copy, including the configured limits.
    showBanner(v.message, persistent: v.isFinalWarning);
  },
  onAiViolationRemoved: (v) {
    // Terminal — they cannot rejoin. Show a blocking notice, then leave.
    showRemovedScreen(v.message);
  },
)

Gaze violations are never reported to the policy, so looking away cannot cost a warning. Reports are also suppressed for the duration of a host break.

A later join by a removed participant fails with GyanmeetJoinError, reason aiViolationRemoved (or insufficientAttendance when they fell short of the batch's minimum attendance).

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.

1
likes
0
points
178
downloads

Publisher

unverified uploader

Weekly Downloads

Gyanmeet meeting SDK for Flutter — a self-contained video meeting widget with host controls, chat, polls, and optional on-device AI proctoring.

Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

dio, flutter, google_mlkit_face_detection, image, livekit_client, livekit_components, path_provider, provider, tflite_flutter

More

Packages that depend on gyanmeet_flutter_sdk