dual_camera_plugin 0.0.1 copy "dual_camera_plugin: ^0.0.1" to clipboard
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),
                  ),
                ],
              ),
            ),
          ),
        ],
      ),
    );
  }
}
1
likes
130
points
14
downloads

Publisher

unverified uploader

Weekly Downloads

A new Flutter plugin for camera usage

Homepage

Documentation

API reference

License

unknown (license)

Dependencies

flutter, permission_handler, plugin_platform_interface

More

Packages that depend on dual_camera_plugin

Packages that implement dual_camera_plugin