Flutter相机功能插件camerawesome_fork的使用

Flutter相机功能插件camerawesome_fork的使用

📸 将相机体验嵌入到自己的应用中不应该那么复杂。这是一个用于集成出色Android/iOS相机体验的Flutter插件。

这个包为您提供了一个可以在您的应用中使用的完全可自定义的相机体验。您可以使用我们内置的界面或根据需要进行自定义。

Fork of camerawesome package

此插件是camerawesome包的一个分叉版本。


以下是一个完整的示例代码,展示了如何在Flutter应用中使用camerawesome_fork插件:

import 'dart:io';

// import 'package:better_open_file/better_open_file.dart';
import 'package:camerawesome_fork/camerawesome_plugin.dart';
import 'package:camerawesome_fork/pigeon.dart';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'camerAwesome',
      home: CameraPage(),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        color: Colors.white,
        child: CameraAwesomeBuilder.awesome(
          onMediaCaptureEvent: (event) {
            switch ((event.status, event.isPicture, event.isVideo)) {
              case (MediaCaptureStatus.capturing, true, false):
                debugPrint('正在捕获照片...');
              case (MediaCaptureStatus.success, true, false):
                event.captureRequest.when(
                  single: (single) {
                    debugPrint('照片已保存: ${single.file?.path}');
                  },
                  multiple: (multiple) {
                    multiple.fileBySensor.forEach((key, value) {
                      debugPrint('多张照片已拍摄: $key ${value?.path}');
                    });
                  },
                );
              case (MediaCaptureStatus.failure, true, false):
                debugPrint('捕获照片失败: ${event.exception}');
              case (MediaCaptureStatus.capturing, false, true):
                debugPrint('正在录制视频...');
              case (MediaCaptureStatus.success, false, true):
                event.captureRequest.when(
                  single: (single) {
                    debugPrint('视频已保存: ${single.file?.path}');
                  },
                  multiple: (multiple) {
                    multiple.fileBySensor.forEach((key, value) {
                      debugPrint('多段视频已拍摄: $key ${value?.path}');
                    });
                  },
                );
              case (MediaCaptureStatus.failure, false, true):
                debugPrint('录制视频失败: ${event.exception}');
              default:
                debugPrint('未知事件: $event');
            }
          },
          saveConfig: SaveConfig.photoAndVideo(
            initialCaptureMode: CaptureMode.photo,
            photoPathBuilder: (sensors) async {
              final Directory extDir = await getTemporaryDirectory();
              final testDir = await Directory(
                '${extDir.path}/camerawesome',
              ).create(recursive: true);
              if (sensors.length == 1) {
                final String filePath =
                    '${testDir.path}/${DateTime.now().millisecondsSinceEpoch}.jpg';
                return SingleCaptureRequest(filePath, sensors.first);
              }
              // 分别处理前后摄像头拍摄的照片
              return MultipleCaptureRequest(
                {
                  for (final sensor in sensors)
                    sensor:
                        '${testDir.path}/${sensor.position == SensorPosition.front ? 'front_' : "back_"}${DateTime.now().millisecondsSinceEpoch}.jpg',
                },
              );
            },
            videoOptions: VideoOptions(
              enableAudio: true,
              ios: CupertinoVideoOptions(
                fps: 10,
              ),
              android: AndroidVideoOptions(
                bitrate: 6000000,
                fallbackStrategy: QualityFallbackStrategy.lower,
              ),
            ),
            exifPreferences: ExifPreferences(saveGPSLocation: true),
          ),
          sensorConfig: SensorConfig.single(
            sensor: Sensor.position(SensorPosition.back),
            flashMode: FlashMode.auto,
            aspectRatio: CameraAspectRatios.ratio_4_3,
            zoom: 0.0,
          ),
          enablePhysicalButton: true,
          // filter: AwesomeFilter.AddictiveRed,
          previewAlignment: Alignment.center,
          previewFit: CameraPreviewFit.contain,
          onMediaTap: (mediaCapture) {
            mediaCapture.captureRequest.when(
              single: (single) {
                debugPrint('单个文件: ${single.file?.path}');
                // single.file?.open();
              },
              multiple: (multiple) {
                multiple.fileBySensor.forEach((key, value) {
                  debugPrint('多个文件已拍摄: $key ${value?.path}');
                  // value?.open();
                });
              },
            );
          },
          availableFilters: awesomePresetFiltersList,
        ),
      ),
    );
  }
}

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

1 回复

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


camerawesome_fork 是一个 Flutter 插件,用于在 Flutter 应用中实现相机功能。它是 camerawesome 的一个分支,提供了更多的功能和改进。以下是如何在 Flutter 项目中使用 camerawesome_fork 插件的步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  camerawesome_fork: ^0.0.1 # 请使用最新的版本号

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

2. 配置相机权限

在 Android 和 iOS 上,你需要配置相机权限。

Android

android/app/src/main/AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

iOS

ios/Runner/Info.plist 文件中添加以下权限:

<key>NSCameraUsageDescription</key>
<string>我们需要访问您的相机以拍摄照片和视频。</string>
<key>NSMicrophoneUsageDescription</key>
<string>我们需要访问您的麦克风以录制视频。</string>

3. 使用 CamerAwesomeFork 插件

在 Flutter 项目中使用 camerawesome_fork 插件来显示相机预览并拍照。

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

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

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

class CameraScreen extends StatefulWidget {
  @override
  _CameraScreenState createState() => _CameraScreenState();
}

class _CameraScreenState extends State<CameraScreen> {
  CameraController? _cameraController;

  @override
  void initState() {
    super.initState();
    _initializeCamera();
  }

  Future<void> _initializeCamera() async {
    _cameraController = CameraController(
      CameraDescription(
        name: '0',
        lensDirection: CameraLensDirection.back,
        sensorOrientation: 90,
      ),
      ResolutionPreset.high,
    );

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

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

  @override
  Widget build(BuildContext context) {
    if (_cameraController == null || !_cameraController!.value.isInitialized) {
      return Center(child: CircularProgressIndicator());
    }

    return Scaffold(
      body: CameraPreview(_cameraController!),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          final image = await _cameraController!.takePicture();
          // 处理拍摄的照片
          print('照片保存路径: ${image.path}');
        },
        child: Icon(Icons.camera),
      ),
    );
  }
}

4. 运行项目

确保你的设备已连接并运行 flutter run 来启动应用。你应该能够看到相机预览,并且可以通过点击浮动按钮来拍摄照片。

5. 其他功能

camerawesome_fork 还提供了许多其他功能,例如:

  • 切换前后摄像头
  • 调整闪光灯模式
  • 录制视频
  • 支持不同的分辨率预设

你可以查阅插件的文档和示例代码来了解更多功能和使用方法。

6. 处理错误和权限

在实际应用中,你需要处理相机权限请求和错误处理。例如,如果用户拒绝了相机权限,你应该提示用户并引导他们去设置中开启权限。

import 'package:permission_handler/permission_handler.dart';

Future<void> _checkCameraPermission() async {
  var status = await Permission.camera.status;
  if (!status.isGranted) {
    await Permission.camera.request();
  }
}
回到顶部