Flutter自定义相机功能插件custom_cam的使用

Flutter 自定义相机功能插件 custom_cam 的使用

概述

custom_cam 是一个用于 iOS 和 Android 平台的 Flutter 插件,允许开发者轻松地设置自定义界面的相机,并支持拍照和录像功能。文件将存储在应用内部,并返回路径和媒体类型。

功能 Android iOS
支持 SDK 21+ iOS 10+*
  • 注意:尽管相机插件可以编译任何版本的 iOS,但其功能要求 iOS 10 或更高版本。如果编译为 iOS 9,则必须在使用任何相机插件功能之前通过编程检查设备上运行的 iOS 版本。

特性

  • 相机权限异常处理。
  • 显示实时相机预览。
  • 设备方向响应式 UI。
  • 录制视频。
  • 拍照。
  • 手势缩放。
  • 通过应用文件持久化存储。

开始使用

pubspec.yaml 中添加依赖

首先,在 pubspec.yaml 文件中添加 custom_cam 作为依赖项:

dependencies:
  custom_cam: ^x.x.x

iOS 配置

ios/Runner/Info.plist 文件中添加以下键值对:

<key>NSCameraUsageDescription</key>
<string>your usage description here</string>
<key>NSMicrophoneUsageDescription</key>
<string>your usage description here</string>

Android 配置

android/app/build.gradle 文件中更改最小 SDK 版本为 21 或更高版本:

minSdkVersion 21

使用示例

以下是一个简单的 Flutter 应用示例,演示如何打开相机并等待相机结果。MultimediaItem 是一个包类,包含两个参数:一个用于存储路径,另一个用于区分视频和照片。

final MultimediaItem? result = await Navigator.of(context).push(
    MaterialPageRoute(builder: (_) => const CustomCamera(
        primaryColor: Color(0xff000fff), 
        secondaryColor: Color(0xfffff0fff), 
        backgroundColor: Color(0xff000faa)
    ))
);

完整示例代码

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

void main() {
  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'CustomCam Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'CustomCam Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _counter = '';

  Future<void> _openCamera() async {
    final MultimediaItem? result = await Navigator.of(context).push(
        MaterialPageRoute(builder: (_) => const CustomCamera(
            primaryColor: Color(0xff000fff),
            secondaryColor: Color(0xfffff0fff),
            backgroundColor: Color(0xff000faa)
        ))
    );
    if (result != null) {
      setState(() {
        _counter = result.path;
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              'A new file was saved to:',
            ),
            Text(
              _counter,
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _openCamera,
        tooltip: 'Camera',
        child: const Icon(Icons.camera_alt),
      ),
    );
  }
}

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

1 回复

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


在Flutter中,如果你想实现自定义相机功能,可以使用一些现有的插件,比如 camera 插件。但如果你需要更多的自定义功能,你可以选择使用 custom_cam 插件,或者自己基于 camera 插件进行扩展。

以下是一个简单的示例,展示如何使用 camera 插件来创建一个自定义相机界面。你可以根据需求进一步扩展和自定义。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  camera: ^0.10.0+1

然后运行 flutter pub get 来获取依赖。

2. 获取可用相机

main.dart 文件中,首先获取可用的相机列表,然后初始化相机控制器。

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

List<CameraDescription>? cameras;

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

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

3. 创建相机界面

使用 CameraController 来控制相机,并在界面上显示相机预览。

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

class _CameraScreenState extends State<CameraScreen> {
  CameraController? _controller;
  Future<void>? _initializeControllerFuture;

  [@override](/user/override)
  void initState() {
    super.initState();
    if (cameras != null && cameras!.isNotEmpty) {
      _controller = CameraController(
        cameras![0], // Use the first available camera
        ResolutionPreset.medium,
      );
      _initializeControllerFuture = _controller!.initialize();
    }
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Custom Camera')),
      body: FutureBuilder<void>(
        future: _initializeControllerFuture,
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            return CameraPreview(_controller!);
          } else {
            return Center(child: CircularProgressIndicator());
          }
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          try {
            await _initializeControllerFuture;
            final image = await _controller!.takePicture();
            // Handle the captured image
            print('Image saved to ${image.path}');
          } catch (e) {
            print(e);
          }
        },
        child: Icon(Icons.camera),
      ),
    );
  }
}
回到顶部