Flutter相机功能插件CameraX的使用

Flutter相机功能插件CameraX的使用

CameraX

CameraX 是一个Flutter插件,它在Android上使用CameraX,在iOS上使用原生API,支持相机预览、拍照和图像分析。

注意: 此插件受到官方camera项目的启发,但更易于使用,并在原生层面上使用MLKit进行图像分析。

Features

  • ✅ CameraView widget.
  • ✅ 控制闪光灯。
  • ❌ 访问文本流。(未实现)
  • ❌ 访问人脸流。(未实现)
  • ❌ 访问姿态流。(未实现)
  • ✅ 访问条码流。
  • ❌ 访问图像标签流。(未实现)
  • ❌ 访问对象检测和跟踪流。(未实现)
  • ❌ 访问数字墨水识别流。(未实现)
  • ❌ 访问自定义模型流。(未实现)
  • ❌ 从图像中检测条形码。(未实现)
  • ❌ 拍照能力。(未实现)
  • ❌ 录像能力。(未实现)

Getting Started

添加依赖

在你的pubspec.yaml文件中添加camerax作为依赖:

dependencies:
  camerax: ^<latest-version>

Android配置

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

注意: 你可以在搭载Android 11或更高版本的设备模拟器和实体设备上运行示例,CameraX不支持在搭载Android 10或更低版本的模拟器上运行。详情请见CameraX入门

iOS配置

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

Issues

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

Screenshots

Home Camera

示例代码

下面是一个简单的Flutter应用示例,展示了如何集成camerax插件。

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

void main() async {
  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);

    return MaterialApp(
      home: HomeView(),
      theme: ThemeData.light().copyWith(platform: TargetPlatform.iOS),
      routes: {
        'analyze': (context) => AnalyzeView(),
        'display': (context) => DisplayView(),
      },
    );
  }
}

// 定义视图组件,例如 HomeView, AnalyzeView, DisplayView 等等
class HomeView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 这里可以添加CameraX的使用代码
    return Scaffold(
      appBar: AppBar(title: Text('CameraX Example')),
      body: Center(child: Text('Welcome to the CameraX example!')),
    );
  }
}

class AnalyzeView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 分析页面的逻辑
    return Scaffold(
      appBar: AppBar(title: Text('Analyze View')),
      body: Center(child: Text('This is the analyze view.')),
    );
  }
}

class DisplayView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 显示页面的逻辑
    return Scaffold(
      appBar: AppBar(title: Text('Display View')),
      body: Center(child: Text('This is the display view.')),
    );
  }
}

此示例只是一个基础框架,具体的CameraX功能(如CameraView的使用)需要根据官方文档进一步开发。希望这个指南能帮助你开始使用CameraX插件!如果你有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


在Flutter中,虽然CameraX是Android平台原生相机库的一个强大工具,但直接在Flutter中使用CameraX并不是最直接的方法。Flutter社区已经有一个官方的相机插件camera,它封装了原生平台的相机功能,可以在iOS和Android上无缝使用。然而,如果你确实想在Flutter中调用CameraX(可能是出于特定功能需求),你需要通过平台通道(Platform Channels)来实现。

不过,为了保持回答的专业性和相关性,我将提供如何在Flutter中使用官方camera插件来实现基本的相机功能,因为这是一个更为常见和推荐的做法。如果你确实需要CameraX的特定功能,可以在理解了基础之后,再探索如何通过平台通道集成CameraX。

使用Flutter官方camera插件

首先,确保你的Flutter环境已经设置好,并且你的项目已经创建。

  1. 添加依赖

在你的pubspec.yaml文件中添加camera依赖:

dependencies:
  flutter:
    sdk: flutter
  camera: ^0.10.0+1  # 请检查最新版本号
  1. 运行flutter pub get
flutter pub get
  1. 配置Android权限

android/app/src/main/AndroidManifest.xml中添加相机权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-feature android:name="android.hardware.camera.autofocus" />
  1. 请求权限并初始化相机

在你的Flutter代码中,请求相机权限并初始化相机控制器:

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

List<CameraDescription> cameras;
CameraController? controller;

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  cameras = await availableCameras();
  controller = CameraController(cameras[0], ResolutionPreset.max);

  controller!.initialize().then((_) {
    if (!mounted) {
      return;
    }
    setState(() {});
  });

  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void reassemble() {
    super.reassemble();
    if (controller!.value.isInitialized) {
      controller!.resumePreview();
    }
  }

  @override
  void dispose() {
    controller?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    if (!controller!.value.isInitialized) {
      return Container();
    }
    return MaterialApp(
      home: Scaffold(
        body: CameraPreview(controller!),
      ),
    );
  }
}

上面的代码演示了如何初始化相机并在屏幕上显示相机预览。请注意,这只是一个基础示例,实际应用中你可能需要处理更多的边缘情况和错误处理。

使用CameraX(高级)

如果你确实需要在Flutter中使用CameraX的特定功能,你可以考虑通过平台通道在Flutter和原生Android代码之间通信。这通常涉及以下步骤:

  1. 在Android原生代码中实现CameraX功能。
  2. 使用MethodChannel在Flutter和原生代码之间通信。
  3. 在Flutter中调用这些原生方法。

由于这个过程相对复杂,并且超出了基础教程的范围,如果你需要具体的CameraX集成示例,建议查阅Flutter和CameraX的官方文档,并探索相关的社区资源和教程。

回到顶部