4

I need to create an online examination application in flutter, where we need to take photo and video of a user at some intervals, and while doing this we don't want to show the camera screen.

I tried to use Camera plugin of flutter and I am able to take photo but I am not able to find any way to capture image without camera preview

Here is my code

import 'dart:async';
import 'dart:io';

import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:path/path.dart' show join;
import 'package:path_provider/path_provider.dart';
import 'package:countdown_flutter/countdown_flutter.dart';

Future<void> main() async {
 WidgetsFlutterBinding.ensureInitialized();

// Obtain a list of the available cameras on the device.
final cameras = await availableCameras();

// Get a specific camera from the list of available cameras.
 final firstCamera = cameras.first;
final frontCam = cameras[1];

runApp(
MaterialApp(
  theme: ThemeData.dark(),
  home: TakePictureScreen(
    // Pass the appropriate camera to the TakePictureScreen widget.
    camera: frontCam,
  ),
),
);
 }

  // A screen that allows users to take a picture using a given camera.
  class TakePictureScreen extends StatefulWidget {
  final CameraDescription camera;

  const TakePictureScreen({
   Key key,
   @required this.camera,
   }) : super(key: key);

   @override
  TakePictureScreenState createState() => TakePictureScreenState();
   }

  class TakePictureScreenState extends State<TakePictureScreen> {
  CameraController _controller;
   Future<void> _initializeControllerFuture;

   @override
   void initState() {
   super.initState();
   // To display the current output from the Camera,
  // create a CameraController.
_controller = CameraController(
  // Get a specific camera from the list of available cameras.
  widget.camera,
  // Define the resolution to use.
  ResolutionPreset.medium,
);

// Next, initialize the controller. This returns a Future.
_initializeControllerFuture = _controller.initialize();
 }

  @override
  void dispose() {
  // Dispose of the controller when the widget is disposed.
_controller.dispose();
super.dispose();
}

 @override
 Widget build(BuildContext context) {
 return Scaffold(
  appBar: AppBar(title: Text('Take a picture')),
  // Wait until the controller is initialized before displaying the
  // camera preview. Use a FutureBuilder to display a loading spinner
  // until the controller has finished initializing.

  body:
  FutureBuilder<void>(
    future: _initializeControllerFuture,
    builder: (context, snapshot) {
      if (snapshot.connectionState == ConnectionState.done) {
        // If the Future is complete, display the preview.
        return CameraPreview(_controller);
      } else {
        // Otherwise, display a loading indicator.
        return Center(child: CircularProgressIndicator());
      }
    },
  ),
  floatingActionButton: FloatingActionButton(
    child: Icon(Icons.camera_alt),
    // Provide an onPressed callback.
    onPressed: () async {
      // Take the Picture in a try / catch block. If anything goes wrong,
      // catch the error.
      try {
        // Ensure that the camera is initialized.
        await _initializeControllerFuture;
        // Construct the path where the image should be saved using the
        // pattern package.
        final path = join(
          // Store the picture in the temp directory.
          // Find the temp directory using the `path_provider` plugin.
          (await getTemporaryDirectory()).path,
          '${DateTime.now()}.png',
        );

        // Attempt to take a picture and log where it's been saved.
        await _controller.takePicture(path);

        // If the picture was taken, display it on a new screen.
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => DisplayPictureScreen(imagePath: path),
          ),
        );
      } catch (e) {
        // If an error occurs, log the error to the console.
        print(e);
      }
    },
  ),
);
 }
 }

 // A widget that displays the picture taken by the user.
 class DisplayPictureScreen extends StatelessWidget {
 final String imagePath ;

  const DisplayPictureScreen({Key key, this.imagePath}) : super(key: key);

  @override
  Widget build(BuildContext context) {
  return Scaffold(
  appBar: AppBar(title: Text('Display the Picture')),
  // The image is stored as a file on the device. Use the `Image.file`
  // constructor with the given path to display the image.
  body:
  Image.file(File(imagePath)),
);
}
 }

I don't want to show the preview screen, yet take images or videos occasionally.

Mrunal
  • 578
  • 2
  • 21
  • 39

1 Answers1

0
  import 'package:camera/camera.dart';
  Future<String?> takePic() async {
    final camera = (await availableCameras()).first;
    final controller = CameraController( camera, ResolutionPreset.low );
    try {
      await controller.initialize();
      await controller.setFlashMode(FlashMode.off);
      final image = await controller.takePicture();
      controller.dispose();
      return image.path;
    }
    catch (e) { 
      // print(e);
      controller.dispose();
      return null;
    }

Change the third line to something like (await availableCameras())[1] to use another camera.

Unknown
  • 97
  • 1
  • 2
  • 8