Flutter相机功能插件camerakit的使用

Flutter相机功能插件camerakit的使用

安装

iOS

info.plist 文件中添加以下配置:

<key>io.flutter.embedded_views_preview</key>
<string>YES</string>
<key>Privacy - Camera Usage Description</key>
<string>Your description here</string>

使用

要使用此插件,首先需要创建一个 CameraKitController 实例,然后初始化 CameraKitView 并传递 CameraKitController 实例。

cameraKitController = CameraKitController();
cameraKitView = CameraKitView(
  cameraKitController: cameraKitController,
  hasBarcodeReader: true,
  barcodeFormat: BarcodeFormats.FORMAT_ALL_FORMATS,
  scaleType: ScaleTypeMode.fill,
  previewFlashMode: CameraFlashMode.auto,
  cameraSelector: CameraSelector.back,
  onPermissionDenied: () {
    print("Camera permission is denied.");
    // 处理用户拒绝权限的情况
  },
  onBarcodeRead: (code) {
    print("Barcode is read: " + code);
    // 处理条形码读取的情况
  },
);

构造函数参数

  • hasBarcodeReader:

    • true 表示启用条形码扫描模式。
    • false 表示启用拍照模式。
  • barcodeFormat:

    • 设置条形码格式,可选值包括所有格式,默认为 FORMAT_ALL_FORMATS
  • scaleType:

    • 有两种模式:ScaleTypeMode.fillScaleTypeMode.fit
    • 如果希望摄像预览填充整个组件区域,请使用 fill 模式。这可能会导致预览被裁剪。
    • 如果希望摄像预览显示整个镜头预览,请使用 fit 模式。这可能会导致预览区域出现空白。
  • previewFlashMode:

    • 可以设置三种模式:CameraFlashMode.autoCameraFlashMode.onCameraFlashMode.off
    • 若要更改模式,可以调用 changeFlashMode 方法。
  • cameraSelector:

    • 设置前后摄像头,可选值为 backfront
  • onPermissionDenied:

    • 用户拒绝运行时权限后调用此方法。
  • onBarcodeRead:

    • 在条形码扫描模式下,当摄像预览检测到条形码时调用此方法。

控制器方法

  • 拍照

    您可以通过调用 takePicture 方法来拍照。如果需要保存到特定路径,可以传入路径参数;否则将保存到默认路径。

    String path = await cameraKitController.takePicture(); // 自定义路径
    
  • 改变闪光灯模式

    要更改闪光灯模式,应调用 changeFlashMode 方法,并传入 CameraFlashMode 枚举值。

    cameraKitController.changeFlashMode(CameraFlashMode.on);
    
  • 暂停和恢复摄像

    插件会自动管理基于 Android 和 iOS 生命周期及小部件可见性的暂停和恢复摄像操作。您也可以通过控制器手动调用这些方法。

    cameraKitController.pauseCamera();
    cameraKitController.resumeCamera();
    

示例代码

以下是完整的示例代码:

import 'dart:async';

import 'package:camerakit/CameraKitController.dart';
import 'package:camerakit/CameraKitView.dart';
import 'package:flutter/material.dart';

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

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

class _MyAppState extends State<MyApp> {
  CameraKitView? cameraKitView;
  CameraFlashMode _flashMode = CameraFlashMode.on;
  CameraKitController? cameraKitController;

  [@override](/user/override)
  void initState() {
    super.initState();
    cameraKitController = CameraKitController();
    cameraKitView = CameraKitView(
      hasBarcodeReader: true,
      onBarcodeRead: (barcode) {
        print("Flutter read barcode: " + barcode);
      },
      previewFlashMode: CameraFlashMode.auto,
      cameraKitController: cameraKitController,
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          child: Column(
            children: <Widget>[
              Expanded(
                child: CameraKitView(
                  hasBarcodeReader: true,
                  barcodeFormat: BarcodeFormats.FORMAT_ALL_FORMATS,
                  scaleType: ScaleTypeMode.fill,
                  onBarcodeRead: (barcode) {
                    print("Flutter read barcode: " + barcode);
                  },
                  previewFlashMode: CameraFlashMode.auto,
                  cameraKitController: cameraKitController,
                  cameraSelector: CameraSelector.back,
                ),
              ),
              Row(
                children: <Widget>[
                  TextButton(
                    child: Text("Flash OFF"),
                    onPressed: () {
                      setState(() {
                        cameraKitController!.changeFlashMode(CameraFlashMode.off);
                      });
                    },
                  ),
                  TextButton(
                    child: Text("Capture"),
                    onPressed: () {
                      cameraKitController!.takePicture().then((value) =>
                          print("flutter take pictre result: " + value!));
                    },
                  ),
                  TextButton(
                    child: Text("Flash On"),
                    onPressed: () {
                      setState(() {
                        cameraKitController!.changeFlashMode(CameraFlashMode.on);
                      });
                    },
                  ),
                ],
              ),
              TextButton(
                child: Text("GO"),
                onPressed: () {
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (context) => Scaffold(
                                body: Text("Go is Here"),
                              )));
                },
              )
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


camera_kit 是一个 Flutter 插件,用于在 Flutter 应用中集成相机功能。它提供了对相机的访问,允许你捕获照片、录制视频以及控制相机的各种设置。以下是使用 camera_kit 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  camera_kit: ^0.9.0  # 请检查最新版本

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

2. 配置权限

在使用相机功能之前,你需要在 AndroidManifest.xmlInfo.plist 文件中配置相应的权限。

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>We need access to your camera to take photos.</string>
<key>NSMicrophoneUsageDescription</key>
<string>We need access to your microphone to record videos.</string>

3. 使用 camera_kit 插件

在 Dart 代码中,你可以使用 camera_kit 插件来访问相机功能。

初始化相机

首先,初始化相机:

import 'package:camera_kit/camera_kit.dart';

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

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

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

  Future<void> _initializeCamera() async {
    _cameraController = await CameraController.initialize();
    setState(() {});
  }

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

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

    return Scaffold(
      body: CameraPreview(_cameraController!),
      floatingActionButton: FloatingActionButton(
        onPressed: _takePicture,
        child: Icon(Icons.camera),
      ),
    );
  }

  Future<void> _takePicture() async {
    if (_cameraController == null || !_cameraController!.isInitialized) {
      return;
    }

    final image = await _cameraController!.takePicture();
    // 处理捕获的图像
    print('Image saved to ${image.path}');
  }
}

捕获照片

在上面的代码中,_takePicture 方法用于捕获照片。捕获的照片将被保存到设备的存储中,你可以通过 image.path 获取图像的路径。

录制视频

你还可以使用 camera_kit 录制视频:

Future<void> _startRecording() async {
  if (_cameraController == null || !_cameraController!.isInitialized) {
    return;
  }

  await _cameraController!.startVideoRecording();
}

Future<void> _stopRecording() async {
  if (_cameraController == null || !_cameraController!.isInitialized) {
    return;
  }

  final video = await _cameraController!.stopVideoRecording();
  // 处理录制的视频
  print('Video saved to ${video.path}');
}

4. 处理捕获的媒体

你可以将捕获的照片或视频显示在应用中,或者上传到服务器。

5. 释放资源

在不再需要相机功能时,记得释放资源:

[@override](/user/override)
void dispose() {
  _cameraController?.dispose();
  super.dispose();
}
回到顶部