можно ли сделать снимок без предварительного просмотра и взаимодействия с пользователем?

#android #flutter #background #camera #flutter-packages

#Android #флаттер #фон #камера #flutter-пакеты

Вопрос:

Мне нужно создать приложение для онлайн-экзамена в flutter, где нам нужно делать фото и видео пользователя через определенные промежутки времени, и при этом мы не хотим показывать экран камеры.

Я попытался использовать плагин камеры для flutter, и я могу делать снимки, но я не могу найти какой-либо способ захвата изображения без предварительного просмотра с камеры

Вот мой код

 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)),
);
}
 }
 

Я не хочу показывать экран предварительного просмотра, но иногда снимаю изображения или видео.

Ответ №1:

   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;
    }
 

Измените третью строку на что-то вроде (await availableCameras())[1] использования другой камеры.