Flutter相机功能增强插件camerax2的使用

CameraX2

一个为 Flutter 设计的相机插件,它在 Android 上使用 CameraX,在 iOS 上使用原生 API,支持相机预览、拍摄和面部检测分析。

注意:此插件受官方 camerax 项目的启发,但更易于使用,并且在原生端使用了 MLKit 进行图像分析。

功能

  • ✅ CameraView 小部件。
  • ✅ 控制手电筒。
  • ✅ 访问面部流。
  • ✅ 拍照能力。

开始使用

pubspec.yaml 文件中添加 camerax2 作为依赖项。

dependencies:
  camerax2: ^<latest-version>

Android

确保在 android/app/build.gradle 文件中的 minSdkVersion 为 21 或更高版本,因为 CameraX 使用的 camera2 API 只支持 Android 5.0 或更高版本。

注意:可以在 Android 11 或更高版本的设备模拟器或物理设备上运行示例。在 Android 10 或更低版本的设备模拟器上无法运行 CameraX。详情见 CameraX 入门指南

iOS

确保最低部署目标为 10.0,因为 MLKit 只支持 iOS 10.0 或更高版本。可以在 iOS 项目中的 Podfile 中取消注释第一行 platform :ios, '10.0'

问题

  • 不支持横向方向。
  • 目前没有测试。

示例代码

main.dart

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

import 'views.dart';

void main() async {
  // 确保 Flutter 绑定已经初始化
  WidgetsFlutterBinding.ensureInitialized();
  
  // 设置首选方向为竖屏
  await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
  
  // 启动应用
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 设置状态栏样式
    final style = SystemUiOverlayStyle.light.copyWith(statusBarColor: Colors.transparent);
    SystemChrome.setSystemUIOverlayStyle(style);

    // 返回 Material 应用程序
    return MaterialApp(
      // 主页面
      home: HomeView(),
      
      // 设置主题
      theme: ThemeData.light().copyWith(platform: TargetPlatform.iOS),
      
      // 路由表
      routes: {
        'analyze': (context) => AnalyzeView(),
        'display': (context) => DisplayView(),
      },
    );
  }
}

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

1 回复

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


在Flutter中,camera 插件是用于访问设备相机功能的官方插件。然而,如果你需要更强大的功能和更好的兼容性,可以考虑使用 camera_x 插件,它是对 camera 插件的增强版本,基于 Android 的 CameraX API。camera_x 插件提供了更现代化的相机功能,并且更容易与最新的 Android 设备兼容。

1. 安装 camera_x 插件

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

dependencies:
  flutter:
    sdk: flutter
  camera_x: ^0.0.1 # 请检查最新版本

然后运行 flutter pub get 来安装插件。

2. 配置 Android 项目

由于 camera_x 插件基于 CameraX API,因此你需要在 android/app/build.gradle 文件中添加 CameraX 的依赖:

dependencies {
    implementation "androidx.camera:camera-core:1.0.0"
    implementation "androidx.camera:camera-camera2:1.0.0"
    implementation "androidx.camera:camera-lifecycle:1.0.0"
    implementation "androidx.camera:camera-view:1.0.0"
}

3. 使用 camera_x 插件

以下是一个简单的示例,展示了如何使用 camera_x 插件来显示相机预览并拍照:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final cameras = await CameraX.getCameras();
  runApp(MyApp(cameras: cameras));
}

class MyApp extends StatelessWidget {
  final List<CameraDescription> cameras;

  MyApp({required this.cameras});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CameraScreen(cameras: cameras),
    );
  }
}

class CameraScreen extends StatefulWidget {
  final List<CameraDescription> cameras;

  CameraScreen({required this.cameras});

  [@override](/user/override)
  _CameraScreenState createState() => _CameraScreenState();
}

class _CameraScreenState extends State<CameraScreen> {
  late CameraXController _controller;

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

  Future<void> _initializeCamera() async {
    _controller = CameraXController(
      widget.cameras.first,
      ResolutionPreset.medium,
    );

    await _controller.initialize();
    if (!mounted) return;
    setState(() {});
  }

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

  Future<void> _takePicture() async {
    try {
      final image = await _controller.takePicture();
      // 处理拍摄的照片
      print('Picture saved to ${image.path}');
    } catch (e) {
      print(e);
    }
  }

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