dual_camera_plugin 0.0.1
dual_camera_plugin: ^0.0.1 copied to clipboard
A new Flutter plugin for camera usage
example/lib/main.dart
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:dual_camera_plugin/dual_camera_plugin.dart';
import 'package:permission_handler/permission_handler.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Dual Camera Plugin Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: CameraScreen(),
);
}
}
class CameraScreen extends StatefulWidget {
@override
_CameraScreenState createState() => _CameraScreenState();
}
class _CameraScreenState extends State<CameraScreen> {
bool _isInitialized = false;
bool _isPreviewRunning = false;
bool _isRecording = false;
CameraType _currentCameraType = CameraType.back;
FlashMode _currentFlashMode = FlashMode.off;
Uint8List? _capturedImage;
String _status = 'Camera not initialized';
@override
void initState() {
super.initState();
_requestPermissions();
}
Future<void> _requestPermissions() async {
await Permission.camera.request();
await Permission.microphone.request();
await Permission.storage.request();
}
Future<void> _initializeCamera() async {
try {
bool success = await DualCameraPlugin.initializeCamera(_currentCameraType);
if (success) {
setState(() {
_isInitialized = true;
_status = 'Camera initialized';
});
} else {
setState(() {
_status = 'Failed to initialize camera';
});
}
} catch (e) {
setState(() {
_status = 'Error: $e';
});
}
}
Future<void> _startPreview() async {
if (!_isInitialized) return;
try {
bool success = await DualCameraPlugin.startPreview();
if (success) {
setState(() {
_isPreviewRunning = true;
_status = 'Preview started';
});
}
} catch (e) {
setState(() {
_status = 'Preview error: $e';
});
}
}
Future<void> _stopPreview() async {
try {
bool success = await DualCameraPlugin.stopPreview();
if (success) {
setState(() {
_isPreviewRunning = false;
_status = 'Preview stopped';
});
}
} catch (e) {
setState(() {
_status = 'Stop preview error: $e';
});
}
}
Future<void> _switchCamera() async {
try {
bool success = await DualCameraPlugin.switchCamera();
if (success) {
CameraType? newType = await DualCameraPlugin.getCurrentCameraType();
setState(() {
_currentCameraType = newType ?? CameraType.back;
_status = 'Switched to ${_currentCameraType.toString().split('.').last} camera';
});
}
} catch (e) {
setState(() {
_status = 'Switch camera error: $e';
});
}
}
Future<void> _takePicture() async {
try {
Uint8List? imageData = await DualCameraPlugin.takePicture();
if (imageData != null) {
setState(() {
_capturedImage = imageData;
_status = 'Picture taken';
});
} else {
setState(() {
_status = 'Failed to capture image';
});
}
} catch (e) {
setState(() {
_status = 'Capture error: $e';
});
}
}
Future<void> _toggleFlash() async {
try {
FlashMode newMode;
switch (_currentFlashMode) {
case FlashMode.off:
newMode = FlashMode.on;
break;
case FlashMode.on:
newMode = FlashMode.auto;
break;
case FlashMode.auto:
newMode = FlashMode.off;
break;
default:
newMode = FlashMode.off;
}
bool success = await DualCameraPlugin.setFlashMode(newMode);
if (success) {
setState(() {
_currentFlashMode = newMode;
_status = 'Flash mode: ${newMode.toString().split('.').last}';
});
}
} catch (e) {
setState(() {
_status = 'Flash error: $e';
});
}
}
Future<void> _startVideoRecording() async {
try {
String filePath = '/storage/emulated/0/DCIM/Camera/video_${DateTime.now().millisecondsSinceEpoch}.mp4';
bool success = await DualCameraPlugin.startVideoRecording(filePath);
if (success) {
setState(() {
_isRecording = true;
_status = 'Recording started';
});
}
} catch (e) {
setState(() {
_status = 'Recording error: $e';
});
}
}
Future<void> _stopVideoRecording() async {
try {
bool success = await DualCameraPlugin.stopVideoRecording();
if (success) {
setState(() {
_isRecording = false;
_status = 'Recording stopped';
});
}
} catch (e) {
setState(() {
_status = 'Stop recording error: $e';
});
}
}
Future<void> _checkCameraAvailability() async {
try {
bool frontAvailable = await DualCameraPlugin.isFrontCameraAvailable();
bool backAvailable = await DualCameraPlugin.isBackCameraAvailable();
bool flashAvailable = await DualCameraPlugin.isFlashAvailable();
setState(() {
_status = 'Front: $frontAvailable, Back: $backAvailable, Flash: $flashAvailable';
});
} catch (e) {
setState(() {
_status = 'Check availability error: $e';
});
}
}
@override
void dispose() {
DualCameraPlugin.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Dual Camera Plugin'),
backgroundColor: Colors.blue,
),
body: Column(
children: [
// Status display
Container(
padding: EdgeInsets.all(16),
width: double.infinity,
color: Colors.grey[200],
child: Text(
_status,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
textAlign: TextAlign.center,
),
),
// Camera preview area (placeholder)
Expanded(
flex: 3,
child: Container(
width: double.infinity,
color: Colors.black,
child: _capturedImage != null
? Image.memory(_capturedImage!, fit: BoxFit.cover)
: Center(
child: Text(
_isPreviewRunning ? 'Camera Preview Running' : 'Camera Preview',
style: TextStyle(color: Colors.white, fontSize: 18),
),
),
),
),
// Control buttons
Expanded(
flex: 2,
child: Padding(
padding: EdgeInsets.all(16),
child: GridView.count(
crossAxisCount: 3,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
children: [
ElevatedButton(
onPressed: _initializeCamera,
child: Text('Initialize'),
style: ElevatedButton.styleFrom(
backgroundColor: _isInitialized ? Colors.green : Colors.blue,
),
),
ElevatedButton(
onPressed: _isInitialized ? (_isPreviewRunning ? _stopPreview : _startPreview) : null,
child: Text(_isPreviewRunning ? 'Stop Preview' : 'Start Preview'),
),
ElevatedButton(
onPressed: _isInitialized ? _switchCamera : null,
child: Text('Switch\n${_currentCameraType.toString().split('.').last}'),
),
ElevatedButton(
onPressed: _isInitialized && _isPreviewRunning ? _takePicture : null,
child: Text('Take Photo'),
style: ElevatedButton.styleFrom(backgroundColor: Colors.orange),
),
ElevatedButton(
onPressed: _isInitialized ? _toggleFlash : null,
child: Text('Flash\n${_currentFlashMode.toString().split('.').last}'),
),
ElevatedButton(
onPressed: _isInitialized && _isPreviewRunning ?
(_isRecording ? _stopVideoRecording : _startVideoRecording) : null,
child: Text(_isRecording ? 'Stop Video' : 'Start Video'),
style: ElevatedButton.styleFrom(
backgroundColor: _isRecording ? Colors.red : Colors.purple,
),
),
ElevatedButton(
onPressed: _checkCameraAvailability,
child: Text('Check\nAvailability'),
),
ElevatedButton(
onPressed: () {
setState(() {
_capturedImage = null;
_status = 'Image cleared';
});
},
child: Text('Clear\nImage'),
),
ElevatedButton(
onPressed: () async {
await DualCameraPlugin.dispose();
setState(() {
_isInitialized = false;
_isPreviewRunning = false;
_isRecording = false;
_status = 'Camera disposed';
});
},
child: Text('Dispose'),
style: ElevatedButton.styleFrom(backgroundColor: Colors.red),
),
],
),
),
),
],
),
);
}
}