A complete, production-ready video calling solution for Flutter using Agora SDK. Supports 1:1 calls, group meetings, screen sharing, and real-time messaging.
- 🎥 High-quality video calls (720p/1080p)
- 🎙️ Crystal clear audio with noise suppression
- 👥 Multi-user conferences (up to 17 participants)
- 🖥️ Screen sharing (Android/iOS/Web)
- 🔒 End-to-end encryption for secure calls
- 🌐 Cross-platform (iOS, Android, Web)
- 💬 In-call chat messaging
- 🎚️ Device management (camera/mic/speaker control)
dependencies:
agora_rtc_engine: ^6.2.1
permission_handler: ^10.2.0
flutter_local_notifications: ^13.0.0
Android:
- Add camera/microphone permissions to
AndroidManifest.xml
- Enable Java 8 support in
build.gradle
iOS:
- Add
NSCameraUsageDescription
andNSMicrophoneUsageDescription
toInfo.plist
- Enable background modes for VoIP
Web:
- Add CSP rules to
index.html
- Configure CORS for your domain
final RtcEngine _engine = await RtcEngine.createWithContext(
RtcEngineContext(
APP_ID, // Your Agora App ID
channelProfile: ChannelProfile.LiveBroadcasting,
)
);
await _engine.enableVideo();
await _engine.setClientRole(ClientRole.Broadcaster);
await _engine.joinChannel(
token: TEMP_TOKEN, // Use null for testing
channelId: 'test_channel',
uid: 0, // 0 = auto-assign UID
options: ChannelMediaOptions(),
);
// Local view
AgoraVideoView(
controller: VideoViewController(
rtcEngine: _engine,
canvas: VideoCanvas(uid: 0),
),
)
// Remote view
AgoraVideoView(
controller: VideoViewController.remote(
rtcEngine: _engine,
canvas: VideoCanvas(uid: remoteUid),
connection: RtcConnection(channelId: 'test_channel'),
),
)
await _engine.startScreenCapture(
ScreenCaptureParameters(
captureAudio: true,
videoParams: ScreenVideoParameters(
dimensions: VideoDimensions(width: 1280, height: 720),
frameRate: 15,
),
),
);
// Toggle camera
await _engine.switchCamera();
// Mute/unmute
await _engine.muteLocalAudioStream(true);
// Speaker control
await _engine.setEnableSpeakerphone(true);
_engine.setEventHandler(RtcEngineEventHandler(
joinChannelSuccess: (channel, uid, elapsed) {
// Handle join success
},
userJoined: (uid, elapsed) {
// Add remote video view
},
userOffline: (uid, reason) {
// Remove remote view
},
));
- Use Tokens (not App ID alone) in production
- Implement token generation on your backend
- Enable encryption with
_engine.setEncryptionSecret()
- Use role-based permissions
MIT License - See LICENSE for details.
I'm open to Flutter development, API integrations, and consulting work.
📱 Phone/WhatsApp: +91 7991327022
📧 Email: harendraprajapati72@gmail.com
🌐 Website: nayaproyog.com
💻 Portfolio: github.helloharendra.io
If you appreciate my work, consider supporting me: