Aplikasi Video Conference dengan Flutter

Pandemi Covid-19 benar-benar mengubah kebiasaan masyarakat. Mulai dari sekolah sampai bekerja yang awalnya kegiatan dilakukan secara tatap muka, sekarang berubah menjadi serba online dengan memanfaatkan teknologi yang bernama Video Conference.

Video Conference memungkinkan kita berkomunikasi dengan lebih dari satu orang dalam waktu yang bersamaan. Kali ini kita akan mencoba membuat aplikasi Video Conference dengan menggunakan Flutter.

Flutter Multi Platform

Sudah tau apa itu Flutter ? jika belum tau, Flutter adalah Software Development Kit (SDK) yang dibuat oleh Google untuk membuat aplikasi multi platform, dengan flutter kita bisa membuat aplikasi Mobile (Android dan Ios), Desktop (Windows, Linux, Mac), dan Web. Flutter menggunakan bahasa pemrograman Dart, untuk mempelajari lebih lanjut tentang Flutter bisa dilihat di flutter.dev

untuk membuat aplikasi video conference kita memerlukan library jitsi_meet. Jitsi meet merupakan platform video conference yang open source dan gratis, kita bisa menggunakan jitsi meet tanpa dipungut biaya apapun, detail dari library jitsi_meet bisa dilihat di https://pub.dev/packages/jitsi_meet . Untuk mempelajari lebih lanjut tentang jitsi meet bisa dilihat di jitsi.org/jitsi-meet/. Library jitsi meet pada flutter hanya support untuk platform mobile saja, jadi tidak bisa digunakan untuk desktop atau web.

Oke langsung saja kita mulai Praktik pembuatan aplikasinya :

1. Buat Project Flutter baru. Buka terminal, lalu ketikkan :

flutter create video_conference_app

maka proses generate file aplikasi akan berjalan.

2. Buka folder project dengan Visual Studio Code yang sudah terinstall Plugin Flutter dengan command :

cd video_conference_app && code .

3. buka file main.dart dari project flutter, file main.dart terdapat pada folder lib

4. Hapus class HomePage, lalu buat satu Stateful Widget dengan nama Dashboard. maka file main.dart menjadi seperti berikut :

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Video Conference App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Dashboard(),
    );
  }
}

class Dashboard extends StatefulWidget {
  @override
  _DashboardState createState() => _DashboardState();
}

class _DashboardState extends State<Dashboard> {
  @override
  Widget build(BuildContext context) {
    return Container(
      
    );
  }
}

5. Buat tampilan untuk mengisi kode join room yang berisi label, textbox, dan. Kita edit class _DashboardState menjadi seperti berikut :

@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: SingleChildScrollView(
          child: Container(
            padding: EdgeInsets.all(
              20.0,
            ),
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Text("Nickname"),
                SizedBox(
                  height: 8.0,
                ),
                TextField(
                  controller: _namaController,
                  focusNode: _nameNode,
                  decoration: InputDecoration(
                    border: OutlineInputBorder(),
                    hintText: 'Masukkan Nickname Kamu',
                  ),
                ),
                SizedBox(
                  height: 16,
                ),
                Text("Meeting ID"),
                SizedBox(
                  height: 8.0,
                ),
                TextField(
                  controller: _codeController,
                  focusNode: _codeNode,
                  decoration: InputDecoration(
                    border: OutlineInputBorder(),
                    hintText: 'Insert Meeting ID',
                  ),
                ),
                SizedBox(
                  height: 16,
                ),
                CheckboxListTile(
                    title: Text("Sound"),
                    value: _isSoundOn,
                    onChanged: (checkedStatus) {
                      setState(() {
                        _isSoundOn = checkedStatus;
                      });
                    }),
                SizedBox(
                  height: 8,
                ),
                CheckboxListTile(
                  title: Text("Camera"),
                  value: _isCameraOn,
                  onChanged: (checkedStatus) {
                    setState(() {
                      _isCameraOn = checkedStatus;
                    });
                  },
                ),
                SizedBox(
                  height: 16,
                ),
                SizedBox(
                  width: double.infinity,
                  child: ElevatedButton(
                    child: Text("Join"),
                    onPressed: _joinRoom,
                  ),
                )
              ],
            ),
          ),
        ),
      ),
    );
  }
}

6. Coba kita run dengan mengetikkan command :

flutter run

maka tampilannya akan menjadi seperti berikut :

Tampilan Halaman Dashboard

7. Selanjutnya kita pasang library jitsi_meet nya pada project kita, buka file pubspect.yaml pada root project, tambahkan kode berikut pada dependencies :

jitsi_meet: ^2.0.0

sehingga dependencies akan menjadi seperti berikut :

dependencies:
  flutter:
    sdk: flutter

  jitsi_meet: ^2.0.0

lalu save file pubspect.yaml, maka proses download library akan dimulai. Atau jika tidak otomatis terdownload anda bisa mengetikkan command berikut pada terminal :

flutter pub get

8. setelah library terinstall, selanjutnya kita lakukan konfigurasi agar aplikasi bisa menjalankan library jitsi_meet

Pada Android :
– buka folder android/app, lalu buka file build.gradle. tambahkan kode berikut pada bagian android

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
}

lalu pada bagian android.defaultConfig, ubah minSdkVersion menjadi 23

defaultConfig {
        applicationId "com.example.video_conference_app"
        minSdkVersion 23
        targetSdkVersion 30
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
}

Lalu pada bagian android.buildTypes.release tambahkan kode untuk membuat proguard, sehingga menjadi seperti berikut :

 buildTypes {
        release {
  
            signingConfig signingConfigs.debug

            minifyEnabled true
            useProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
}

sehingga build.gradle menjadi seperti berikut :

...
android {
    compileSdkVersion 30

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    defaultConfig {
        applicationId "com.example.video_conference_app"
        minSdkVersion 23
        targetSdkVersion 30
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

    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

            minifyEnabled true
            useProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
...

– setelah itu buka folder android/app/src/main lalu buka file AndroidManifest.xml. lalu tambahkan kode berikut pada tag Application

tools:replace="android:label"

Tambahkan juga kode berikut pada tag manifest

xmlns:tools="http://schemas.android.com/tools"
sehingga menjadi seperti berikut
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.video_conference_app">
   <application
        tools:replace="android:label" 
        android:label="video_conference_app"
        android:icon="@mipmap/ic_launcher">
    ...
   </application>
 ...
</manifest>

 Pada Ios :
– Buka folder ios lalu buka file Podfile. Uncomment global platform, lalu ubah menjadi versi 11.

platform :ios, '11.0'

– Buka folder ios/Runner lalu edit file info.plist. tambahkan kode untuk mengakses Camera dan Microphone :

<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>

9. Setelah konfigurasi selesai, Kembali ke file main.dart. import library jitsi meet dengan menambahkan kode berikut

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:jitsi_meet/feature_flag/feature_flag_enum.dart';
import 'package:jitsi_meet/jitsi_meet.dart';
import 'package:jitsi_meet/jitsi_meeting_listener.dart';

10. buat function untuk join room, kode nya adalah sebagai berikut :

void _joinRoom() async {
    try {
      // Enable or disable any feature flag here
      // If feature flag are not provided, default values will be used
      // Full list of feature flags (and defaults) available in the README
      Map<FeatureFlagEnum, bool> featureFlags = {
        FeatureFlagEnum.WELCOME_PAGE_ENABLED: false,
        FeatureFlagEnum.INVITE_ENABLED: false
      };

      // Here is an example, disabling features for each platform
      if (Platform.isAndroid) {
        // Disable ConnectionService usage on Android to avoid issues (see README)
        featureFlags[FeatureFlagEnum.CALL_INTEGRATION_ENABLED] = false;
      } else if (Platform.isIOS) {
        // Disable PIP on iOS as it looks weird
        featureFlags[FeatureFlagEnum.PIP_ENABLED] = false;
      }

      // Define meetings options here
      var options = JitsiMeetingOptions()
        ..room = _codeController.text
        ..userDisplayName = _namaController.text
        ..audioMuted = !_isSoundOn
        ..videoMuted = !_isCameraOn;

      debugPrint("JitsiMeetingOptions: $options");
      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");
        }),
      );
    } catch (error) {
      debugPrint("error: $error");
    }
 }

11. setelah itu kita masukkan _joinRoom ke onPressed yang ada pada button join

ElevatedButton(
 child: Text("Join"),
 onPressed: _joinRoom,
),

12. Setelah itu run aplikasi. isi form Nama dan Meeting ID, lalu klik Join

Tampilan Form yang telah terisi

maka akan muncul tampilan loading proses penyambungan ke room

Tampilan Loading Room

Jika ada dialog permintaan permission microphone dan camera, klik allow agar aplikasi bisa berjalan

Permintaan Permission

Jika sudah maka tampilan Video Conference akan muncul

Tampilan Video Conference

13. Selamat aplikasi Video Conference sudah berhasil dibuat. Jika ingin ada orang lain yang join di room, masukkan Meeting ID yang sama.
Berikut tampilannya jika ada orang lain yang join ke room :

Tampilan Video Conference

Terdapat juga fitur chat bawaan dari library jitsi dengan klik icon chat di pojok kiri bawah

Chat Bawaan Jitsi Meet

library jitsi meet hanya bisa digunakan untuk video conference / voice conference saja, belum bisa digunakan untuk presentasi / sharescreen. Jika ingin menggunakan Video Conference untuk kebutuhan aplikasi Production disarankan menggunakan server sendiri, karena pada tutorial ini secara default kita terhubung ke server public dari jitsi. Untuk mengetahui cara setup jitsi ke server bisa dilihat di : https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-quickstart

Bagaimana, cukup mudah bukan ?
Cukup simple dan tidak memerlukan banyak kode, dengan Flutter kita bisa membuat aplikasi video conference sederhana untuk ios dan android hanya dengan satu bahasa pemrograman yaitu Dart.

Untuk melihat kode pada tutorial ini secara lengkap bisa ke link dibawah ini :

https://github.com/asyarialmuslimin/SimpleVideoConferenceApp

sekian artikel dari saya, semoga bermanfaat untuk para pembaca sekalian

Wassalamu’alaikum, Salam sejahtera untuk kita semua.

Leave A Comment

Your email address will not be published. Required fields are marked *