A Flutter plugin for managing multiple camera instances simultaneously with built-in ML kit support.
- Multiple simultaneous cameras - Run multiple camera instances at the same time
- Image capture - Capture images from any camera instance
- Front/Back camera support - Easy switching between camera directions
- Text recognition - Real-time text recognition using MLKit
- Barcode scanning - Detect and scan various barcode formats
- Face detection - Real-time face detection capabilities
- Cross-platform - Supports both iOS and Android
Add this to your package's pubspec.yaml file:
dependencies:
multicamera: ^1.3.11Or install from the repository:
dependencies:
multicamera:
git:
url: https://github.com/alexdempster44/multicamera.gitThen run:
flutter pub getAdd the following keys to your ios/Runner/Info.plist:
<key>NSCameraUsageDescription</key>
<string>This app needs camera access to capture photos and video</string>Add the following permissions to your android/app/src/main/AndroidManifest.xml:
<uses-permission android:name="android.permission.CAMERA" />Important: This plugin does not handle camera permission requests. It is the developer's responsibility to request and ensure that camera permissions have been granted before calling camera.initialize().
You can use the permission_handler package or platform-specific permission APIs to request camera access:
import 'package:permission_handler/permission_handler.dart';
// Request camera permission before initializing
final status = await Permission.camera.request();
if (!status.isGranted) {
// Handle permission denied
return;
}
await camera.initialize();import 'package:multicamera/multicamera.dart';
// Create a camera instance
final camera = Camera(
direction: CameraDirection.front,
paused: false,
);
// Initialize the camera
await camera.initialize();import 'package:flutter/material.dart';
import 'package:multicamera/multicamera.dart';
class CameraScreen extends StatefulWidget {
@override
State<CameraScreen> createState() => _CameraScreenState();
}
class _CameraScreenState extends State<CameraScreen> {
late final Camera camera;
@override
void initState() {
super.initState();
camera = Camera(direction: CameraDirection.front);
camera.initialize();
}
@override
Widget build(BuildContext context) {
return CameraPreview(
camera: camera,
mirror: true, // Mirror the preview (only affects the front camera)
crop: false, // Fit or crop the preview to the available space
);
}
@override
void dispose() {
camera.dispose();
super.dispose();
}
}// Capture an image from the camera
Uint8List? imageData = await camera.captureImage();
if (imageData case final data?) {
Image.memory(data); // Display the image
}// Create multiple camera instances
final frontCamera = Camera(direction: CameraDirection.front);
final backCamera = Camera(direction: CameraDirection.back);
await frontCamera.initialize();
await backCamera.initialize();
// Display both previews
Row(
children: [
Expanded(child: CameraPreview(camera: frontCamera)),
Expanded(child: CameraPreview(camera: backCamera)),
],
);final camera = Camera(direction: CameraDirection.back);
// Set up text recognition callback
camera.onTextRecognized = (List<String> recognizedText) {
print('Recognized text: $recognizedText');
};
await camera.initialize();final camera = Camera(direction: CameraDirection.back);
// Set up barcode scanning callback
camera.onBarcodesScanned = (List<String> barcodes) {
print('Scanned barcodes: $barcodes');
};
await camera.initialize();final camera = Camera(direction: CameraDirection.front);
// Set up face detection callback
camera.onFaceDetected = (bool faceDetected) {
print('Face detected: $faceDetected');
};
await camera.initialize();// Change camera direction
camera.direction = CameraDirection.back;
// Pause/resume camera
camera.paused = true; // Pause
camera.paused = false; // ResumeSee the example directory for a complete sample application demonstrating multiple cameras, image capture, and ML features.
This is free and unencumbered software released into the public domain. See the LICENSE file for details.