// ignore_for_file: dead_code import 'dart:async'; import 'dart:io'; import 'package:camera/camera.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:path_provider/path_provider.dart'; import 'package:provider/provider.dart'; import '../../../providers/test_results.dart'; class CaptureImage extends StatefulWidget { @override _CaptureImageState createState() { return _CaptureImageState(); } } /// Returns a suitable camera icon for [direction]. IconData getCameraLensIcon(CameraLensDirection direction) { switch (direction) { case CameraLensDirection.back: return Icons.camera_rear; case CameraLensDirection.front: return Icons.camera_front; case CameraLensDirection.external: return Icons.camera; } throw ArgumentError('Unknown lens direction'); } void logError(String code, String message) => print('Error: $code\nError Message: $message'); class _CaptureImageState extends State with WidgetsBindingObserver { CameraController? controller; String? imagePath; // String videoPath; VoidCallback? videoPlayerListener; bool isInit = true; int curCamera = 0; var cameras; @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); } @override void didChangeDependencies() async { if (isInit) { cameras = await availableCameras(); onNewCameraSelected(cameras[curCamera]); setState(() { isInit = false; }); } super.didChangeDependencies(); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); super.dispose(); } @override void didChangeAppLifecycleState(AppLifecycleState state) { // App state changed before we got the chance to initialize. if (controller == null || !controller!.value.isInitialized) { return; } if (state == AppLifecycleState.inactive) { controller?.dispose(); } else if (state == AppLifecycleState.resumed) { if (controller != null) { onNewCameraSelected(controller!.description); } } } final GlobalKey _scaffoldKey = GlobalKey(); @override Widget build(BuildContext context) { return SafeArea( child: Scaffold( key: _scaffoldKey, // appBar: AppBar( // title: const Text('Take Picture'), // ), body: isInit ? Center( child: CircularProgressIndicator( color: Colors.black, ), ) : Stack(children: [ _cameraPreviewWidget(), Positioned( bottom: 100, left: 100, child: _captureControlRowWidget()), Positioned( bottom: 100, right: 100, child: InkWell( onTap: () { if (curCamera == 0) { try { onNewCameraSelected(cameras[1]); setState(() { curCamera = 1; }); } catch (e) {} } else { onNewCameraSelected(cameras[0]); setState(() { curCamera = 0; }); } }, child: Icon( curCamera == 0 ? Icons.camera_rear : Icons.camera_front, size: 40, color: Colors.white, ), ), ), // _cameraTogglesRowWidget(cameras), ]), ), ); } /// Display the preview from the camera (or a message if the preview is not available). Widget _cameraPreviewWidget() { if (controller == null || !controller!.value.isInitialized) { return const Text( 'Tap a camera', style: TextStyle( color: Colors.white, fontSize: 24.0, fontWeight: FontWeight.w900, ), ); } else { return Container( width: double.infinity, child: CameraPreview(controller!), ); } } /// Toggle recording audio /// Display the control bar with buttons to take pictures and record videos. Widget _captureControlRowWidget() { return Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisSize: MainAxisSize.max, children: [ IconButton( icon: const Icon( Icons.camera_alt, size: 40, color: Colors.white, ), // color: Colors.blue, onPressed: controller != null && controller!.value.isInitialized && !controller!.value.isRecordingVideo ? onTakePictureButtonPressed : null, ), ], ); } getCameras() async { return await availableCameras(); } /// Display a row of toggle to select the camera (or a message if no camera is available). // Widget _cameraTogglesRowWidget(var cameras) { // final List toggles = []; // if (cameras.isEmpty) { // return const Text('No camera found'); // } else { // for (CameraDescription cameraDescription in cameras) { // print("${cameraDescription.name}"); // toggles.add( // SizedBox( // width: 90.0, // child: RadioListTile( // title: Icon(getCameraLensIcon(cameraDescription.lensDirection)), // groupValue: controller?.description, // value: cameraDescription, // onChanged: controller != null && controller.value.isRecordingVideo // ? null // : onNewCameraSelected, // ), // ), // ); // } // } // return Row(children: toggles); // } String timestamp() => DateTime.now().millisecondsSinceEpoch.toString(); void showInSnackBar(String message) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(message), ), ); } void onNewCameraSelected(CameraDescription cameraDescription) async { print(cameraDescription.lensDirection.toString()); if (controller != null) { await controller!.dispose(); } controller = CameraController( cameraDescription, ResolutionPreset.medium, // enableAudio: enableAudio, ); // If the controller is updated then update the UI. controller!.addListener(() { if (mounted) setState(() {}); if (controller!.value.hasError) { showInSnackBar('Camera error ${controller!.value.errorDescription}'); } }); try { await controller!.initialize(); } on CameraException catch (e) { _showCameraException(e); } if (mounted) { setState(() {}); } } void onTakePictureButtonPressed() { takePicture().then((String? filePath) { if (mounted) { setState(() { imagePath = filePath; var profileProviderObject = Provider.of(context, listen: false); List files = profileProviderObject.catchImages; print(imagePath); files.add(PlatformFile( name: 'test', size: 0, path: imagePath, bytes: File(imagePath!).readAsBytesSync())); profileProviderObject.setCatchImages(files); profileProviderObject.setImages(); print(imagePath); }); if (filePath != null) { Navigator.of(context).pop(); // showInSnackBar('Picture saved to $filePath'); } } }); } Future takePicture() async { if (!controller!.value.isInitialized) { showInSnackBar('Error: select a camera first.'); return null; } final Directory extDir = await getApplicationDocumentsDirectory(); final String dirPath = '${extDir.path}/Pictures/flutter_test'; await Directory(dirPath).create(recursive: true); final String filePath = '$dirPath/${timestamp()}.jpg'; if (controller!.value.isTakingPicture) { // A capture is already pending, do nothing. return null; } try { await controller!.takePicture(); } on CameraException catch (e) { _showCameraException(e); return null; } return filePath; } void _showCameraException(CameraException e) { logError(e.code, e.description!); showInSnackBar('Error: ${e.code}\n${e.description}'); } } // class CameraApp extends StatelessWidget { // @override // Widget build(BuildContext context) { // return MaterialApp( // home: CaptureImage(), // ); // } // } // List cameras = []; // Future main() async { // // Fetch the available cameras before initializing the app. // try { // WidgetsFlutterBinding.ensureInitialized(); // } on CameraException catch (e) { // logError(e.code, e.description); // } // runApp(CameraApp()); // }