Flutter相机功能插件camera_plugin的使用

Flutter相机功能插件camera_plugin的使用

在本教程中,我们将详细介绍如何在Flutter应用中使用camera_plugin插件来实现相机功能。该插件允许你轻松地访问设备上的摄像头,并进行预览和扫描。

准备工作

首先,确保你的项目依赖了camera_plugin库。你需要在pubspec.yaml文件中添加以下依赖项:

dependencies:
  flutter:
    sdk: flutter
  camera_plugin: ^版本号

然后运行flutter pub get以安装依赖。

示例代码

下面是一个完整的示例代码,展示了如何使用camera_plugin插件来实现相机预览功能。

main.dart

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:camera_plugin/camera_plugin.dart';

late List _myCameras;

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  _myCameras = await availableCameras();
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  CameraController? cameraController;

  double previewWidth = 1, previewHeight = 1;

  [@override](/user/override)
  void initState() {
    super.initState();
    initCamera();
  }

  Future<void> initCamera() async {
    if (_myCameras.isNotEmpty) {
      cameraController = CameraController(
        _myCameras.first,
        ResolutionPreset.high,
        enableAudio: false,
        scanCaptureChanged: (value) {
          print("returnScanResult: $value");
        },
      );

      await cameraController!.initialize();

      print("camera value: ${cameraController!.value}");

      previewWidth = cameraController!.value.previewSize!.width;
      previewHeight = cameraController!.value.previewSize!.height;
      if (!mounted) {
        return;
      }

      setState(() {});
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    double width = 300;
    double height = (previewWidth / previewHeight) * width;

    double scale = 0.5;

    print("previewWidth: $previewWidth, previewHeight: $previewHeight");

    double scanWidth = width * scale;

    return MaterialApp(
      home: Scaffold(
          body: cameraController == null
              ? Container()
              : Center(
                  child: SizedBox(
                    width: width,
                    height: height,
                    child: Stack(
                      fit: StackFit.expand,
                      children: [
                        CameraPreview(
                          cameraController!,
                          child: TextButton(
                            onPressed: () async {
                              cameraController!.stopScan();
                            },
                            child: Text("turn"),
                          ),
                        ),
                        // Positioned(
                        //     left: width / 2 - scanWidth / 2,
                        //     top: height / 2 - scanWidth / 2,
                        //     child: Container(
                        //       width: scanWidth,
                        //       height: scanWidth,
                        //       color: Colors.red,
                        //     ))
                      ],
                    ),
                  ),
                )),
    );
  }
}

代码解释

  • 导入必要的包

    import 'package:flutter/material.dart';
    import 'dart:async';
    import 'package:camera_plugin/camera_plugin.dart';
    
  • 初始化摄像头

    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      _myCameras = await availableCameras();
      runApp(const MyApp());
    }
    
  • 定义MyApp类并初始化摄像头控制器

    class _MyAppState extends State<MyApp> {
      CameraController? cameraController;
    
      double previewWidth = 1, previewHeight = 1;
    
      [@override](/user/override)
      void initState() {
        super.initState();
        initCamera();
      }
    
      Future<void> initCamera() async {
        if (_myCameras.isNotEmpty) {
          cameraController = CameraController(
            _myCameras.first,
            ResolutionPreset.high,
            enableAudio: false,
            scanCaptureChanged: (value) {
              print("returnScanResult: $value");
            },
          );
    
          await cameraController!.initialize();
    
          print("camera value: ${cameraController!.value}");
    
          previewWidth = cameraController!.value.previewSize!.width;
          previewHeight = cameraController!.value.previewSize!.height;
          if (!mounted) {
            return;
          }
    
          setState(() {});
        }
      }
    
  • 构建UI

    [@override](/user/override)
    Widget build(BuildContext context) {
      double width = 300;
      double height = (previewWidth / previewHeight) * width;
    
      double scale = 0.5;
    
      print("previewWidth: $previewWidth, previewHeight: $previewHeight");
    
      double scanWidth = width * scale;
    
      return MaterialApp(
        home: Scaffold(
            body: cameraController == null
                ? Container()
                : Center(
                    child: SizedBox(
                      width: width,
                      height: height,
                      child: Stack(
                        fit: StackFit.expand,
                        children: [
                          CameraPreview(
                            cameraController!,
                            child: TextButton(
                              onPressed: () async {
                                cameraController!.stopScan();
                              },
                              child: Text("turn"),
                            ),
                          ),
                          // Positioned(
                          //     left: width / 2 - scanWidth / 2,
                          //     top: height / 2 - scanWidth / 2,
                          //     child: Container(
                          //       width: scanWidth,
                          //       height: scanWidth,
                          //       color: Colors.red,
                          //     ))
                        ],
                      ),
                    ),
                  )),
      );
    }
    

更多关于Flutter相机功能插件camera_plugin的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter相机功能插件camera_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


camera_plugin 是 Flutter 中用于访问设备相机功能的插件。它允许你轻松地在 Flutter 应用中集成相机功能,包括拍照、录像、实时预览等。以下是如何使用 camera_plugin 的基本步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 camera 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  camera: ^0.10.0+1 # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 获取相机列表

在 Flutter 应用中,你首先需要获取设备上可用的相机列表。

import 'package:camera/camera.dart';

List<CameraDescription> cameras;

Future<void> main() async {
  // 确保插件服务已初始化
  WidgetsFlutterBinding.ensureInitialized();

  // 获取设备上的相机列表
  cameras = await availableCameras();

  // 启动应用
  runApp(MyApp());
}

3. 初始化相机控制器

在获取相机列表后,你可以选择一个相机并初始化 CameraController

class CameraApp extends StatefulWidget {
  [@override](/user/override)
  _CameraAppState createState() => _CameraAppState();
}

class _CameraAppState extends State<CameraApp> {
  CameraController controller;

  [@override](/user/override)
  void initState() {
    super.initState();
    // 初始化相机控制器
    controller = CameraController(cameras[0], ResolutionPreset.medium);
    controller.initialize().then((_) {
      if (!mounted) {
        return;
      }
      setState(() {});
    });
  }

  [@override](/user/override)
  void dispose() {
    controller?.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    if (!controller.value.isInitialized) {
      return Container();
    }
    return AspectRatio(
      aspectRatio: controller.value.aspectRatio,
      child: CameraPreview(controller),
    );
  }
}

4. 拍照或录像

你可以使用 CameraController 来拍照或录像。

拍照

Future<void> takePicture() async {
  if (!controller.value.isInitialized) {
    return null;
  }
  if (controller.value.isTakingPicture) {
    return null;
  }
  try {
    final XFile picture = await controller.takePicture();
    // 处理拍照后的图片文件
    print('Picture saved to ${picture.path}');
  } catch (e) {
    print(e);
  }
}

录像

Future<void> startRecording() async {
  if (!controller.value.isInitialized) {
    return null;
  }
  if (controller.value.isRecordingVideo) {
    return null;
  }
  try {
    await controller.startVideoRecording();
  } catch (e) {
    print(e);
  }
}

Future<void> stopRecording() async {
  if (!controller.value.isRecordingVideo) {
    return null;
  }
  try {
    final XFile video = await controller.stopVideoRecording();
    // 处理录像后的视频文件
    print('Video saved to ${video.path}');
  } catch (e) {
    print(e);
  }
}

5. 完整示例

以下是一个简单的完整示例,展示如何在 Flutter 应用中使用 camera 插件。

import 'package:camera/camera.dart';
import 'package:flutter/material.dart';

List<CameraDescription> cameras;

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  cameras = await availableCameras();
  runApp(CameraApp());
}

class CameraApp extends StatefulWidget {
  [@override](/user/override)
  _CameraAppState createState() => _CameraAppState();
}

class _CameraAppState extends State<CameraApp> {
  CameraController controller;

  [@override](/user/override)
  void initState() {
    super.initState();
    controller = CameraController(cameras[0], ResolutionPreset.medium);
    controller.initialize().then((_) {
      if (!mounted) {
        return;
      }
      setState(() {});
    });
  }

  [@override](/user/override)
  void dispose() {
    controller?.dispose();
    super.dispose();
  }

  Future<void> takePicture() async {
    if (!controller.value.isInitialized) {
      return null;
    }
    if (controller.value.isTakingPicture) {
      return null;
    }
    try {
      final XFile picture = await controller.takePicture();
      print('Picture saved to ${picture.path}');
    } catch (e) {
      print(e);
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    if (!controller.value.isInitialized) {
      return Container();
    }
    return Scaffold(
      appBar: AppBar(title: Text('Camera Example')),
      body: AspectRatio(
        aspectRatio: controller.value.aspectRatio,
        child: CameraPreview(controller),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: takePicture,
        child: Icon(Icons.camera),
      ),
    );
  }
}
回到顶部