Flutter相机功能插件flutter_camera的使用

发布于 1周前 作者 phonegap100 来自 Flutter

Flutter相机功能插件flutter_camera的使用

插件介绍

Flutter插件flutter_camera允许访问设备摄像头并录制视频。该插件目前仍在开发中,部分API可能尚未可用。我们正在跟进一个重构工作,可以在这里查看:issue

此包完全依赖于flutter camera插件来提供摄像头访问权限。

目前仅支持Android和iOS平台。

功能特性

  • 显示实时摄像头预览在自定义控件中。
  • 可以捕捉快照并返回路径。
  • 支持设备闪光灯。
  • 从Dart代码中获取图像流。
  • 实时摄像头翻转(点击切换前后摄像头)。
  • 只需三行代码即可实现。

安装

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

iOS
  • 相机插件功能适用于iOS 10.0或更高版本。如果要编译低于10.0的版本,请确保在使用任何相机插件功能之前,程序化检查运行中的iOS版本。例如,可以使用device_info_plus插件来检查iOS版本。
  • ios/Runner/Info.plist中添加两行:
    • 一行带有键Privacy - Camera Usage Description和描述。
    • 一行带有键Privacy - Microphone Usage Description和描述。
  • 或者在文本格式中添加键:
    <key>NSCameraUsageDescription</key>
    <string>Can I use the camera please?</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>Can I use the mic please?</string>
    
Android
  • 将最小Android SDK版本更改为21(或更高)在android/app/build.gradle文件中。
    minSdkVersion 21
    

示例代码

以下是一个简单的示例Flutter应用,显示全屏摄像头预览并支持视频录制。

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_camera/flutter_camera.dart';

class CameraPage extends StatefulWidget {
  const CameraPage({Key? key}) : super(key: key);

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

class _CameraPageState extends State<CameraPage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return FlutterCamera(
      color: Colors.amber,
      onImageCaptured: (value) {
        final path = value.path;
        print("::::::::::::::::::::::::::::::::: $path");
        if (path.contains('.jpg')) {
          showDialog(
              context: context,
              builder: (context) {
                return AlertDialog(
                  content: Image.file(File(path)),
                );
              });
        }
      },
      onVideoRecorded: (value) {
        final path = value.path;
        print('::::::::::::::::::::::::;; dkdkkd $path');
      },
    );
    // return Container();
  }
}

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

1 回复

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


当然,以下是如何在Flutter应用中使用flutter_camera插件来实现相机功能的示例代码。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_camera: ^0.10.0+3  # 请注意版本号,使用最新版本

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

2. 请求相机权限

在Android和iOS上,你需要请求相机权限。这通常在你的AndroidManifest.xmlInfo.plist文件中进行配置。

Android (AndroidManifest.xml)

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <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" />

    <!-- 其他配置 -->

</manifest>

iOS (Info.plist)

<key>NSCameraUsageDescription</key>
<string>Your app needs access to the camera</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Your app needs access to the photo library for saving photos</string>

3. 实现相机功能

以下是一个简单的Flutter应用示例,展示了如何使用flutter_camera插件来捕捉图片。

main.dart

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.high);
  controller!.initialize().then((_) {
    runApp(MyApp());
  });
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Camera App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  CameraImage? _lastImage;

  Future<void> _takePicture() async {
    try {
      final XFile? file = await controller!.takePicture();

      if (mounted) {
        setState(() {
          _lastImage = file!.readAsBytesSync();
        });
      }
    } catch (e) {
      print(e);
    }
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Camera App'),
      ),
      body: Column(
        children: <Widget>[
          Expanded(
            child: CameraPreview(controller!),
          ),
          AspectRatio(
            aspectRatio: controller!.value.aspectRatio,
            child: _lastImage == null
                ? Container(
                    color: Colors.black,
                  )
                : Image.memory(_lastImage!),
          ),
          FloatingActionButton(
            onPressed: _takePicture,
            tooltip: 'Capture',
            child: Icon(Icons.camera_alt),
          ),
        ],
      ),
    );
  }
}

4. 运行应用

确保你的设备或模拟器支持相机功能,然后运行你的Flutter应用。你应该能够看到一个相机预览,并且可以通过点击浮动按钮来捕捉图片。

注意事项

  • 在真实设备上测试相机功能,因为模拟器可能不支持相机。
  • 确保处理相机权限请求,并在用户拒绝权限时提供适当的反馈。
  • 考虑到性能和内存管理,特别是在处理高分辨率图像时。

这个示例提供了一个基本的相机功能实现,你可以根据需要进一步扩展和自定义。

回到顶部