Flutter相机功能插件camera_works的使用

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

Flutter相机功能插件camera_works的使用

Camera Works 是一个处理相机功能的简单库,重点在于稳定性。它是一个用于 Flutter 的相机插件,在 Android 上使用 CameraX,在 iOS 上使用原生 API,支持拍照、闪光灯和切换摄像头。

我制作了这个插件,因为官方的相机插件存在一些尚未解决的 BUG。

注意:目前该插件仅支持 Android 平台。此插件受到了官方 camera 插件的启发。

特性

  • ✅ 切换前后摄像头
  • ✅ 拍照
  • ✅ 控制闪光灯

开始使用

在你的 pubspec.yaml 文件中添加 camera_works 作为依赖项。

dependencies:
  camera_works: ^<最新版本>

Android

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

注意:你可以在一个设备模拟器(Android 11 或更高版本)或物理设备上运行示例。CameraX 在 Android 10 或更低版本的模拟器上无法工作。更多信息可以查看 这里

示例代码

以下是使用 camera_works 插件的基本示例:

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

import 'camera_page.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // 设置屏幕方向为竖屏
  await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    // 设置系统栏样式
    final style = SystemUiOverlayStyle.light.copyWith(statusBarColor: Colors.transparent);
    SystemChrome.setSystemUIOverlayStyle(style);

    return MaterialApp(
      home: CameraPage(), // 主页面为 CameraPage
    );
  }
}

CameraPage 示例代码

以下是 CameraPage 的详细实现代码:

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

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

class _CameraPageState extends State<CameraPage> {
  CameraController? _controller;

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

  Future<void> _initializeCamera() async {
    final cameras = await availableCameras();
    if (cameras.isNotEmpty) {
      final firstCamera = cameras.first;
      _controller = CameraController(
        firstCamera,
        ResolutionPreset.high,
      );

      await _controller!.initialize();
      setState(() {});
    }
  }

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

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

    return Scaffold(
      appBar: AppBar(title: Text('相机功能演示')),
      body: CameraPreview(_controller!),
      floatingActionButton: Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: [
          FloatingActionButton(
            onPressed: () async {
              if (_controller != null && _controller!.value.isInitialized) {
                final image = await _controller!.takePicture();
                // 处理拍照后的图片
              }
            },
            child: Icon(Icons.camera),
          ),
          FloatingActionButton(
            onPressed: () async {
              if (_controller != null) {
                await _controller!.setFlashMode(FlashMode.torch);
              }
            },
            child: Icon(Icons.flash_on),
          ),
          FloatingActionButton(
            onPressed: () async {
              if (_controller != null) {
                await _controller!.setRotation(90);
                await _controller!.flipCamera();
              }
            },
            child: Icon(Icons.flip_camera_ios),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用camera插件(假设你提到的camera_works是指官方的camera插件)来实现相机功能的代码示例。

首先,确保你已经在pubspec.yaml文件中添加了camera插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  camera: ^0.14.0+1  # 请检查最新版本号并替换

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

接下来,你需要配置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>需要访问相机</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问相册</string>
<key>NSMicrophoneUsageDescription</key>
<string>需要访问麦克风</string>

Flutter代码实现

接下来,在你的Flutter应用中实现相机功能。以下是一个简单的示例:

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

List<CameraDescription> cameras;
CameraController? controller;

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

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

class CameraApp extends StatefulWidget {
  @override
  _CameraAppState createState() => _CameraAppState();
}

class _CameraAppState extends State<CameraApp> {
  CameraController? _controller;

  @override
  void initState() {
    super.initState();
    availableCameras().then((availableCameras) {
      cameras = availableCameras;

      if (cameras.isNotEmpty) {
        _controller = CameraController(
          cameras[0],
          ResolutionPreset.medium,
        );

        _controller!.initialize().then((_) {
          if (!mounted) {
            return;
          }
          setState(() {});
        });
      }
    }).catchError((err) {
      print('Error: ${err.code}\n${err.message}');
    });
  }

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

  @override
  Widget build(BuildContext context) {
    if (!_controller!.value.isInitialized) {
      return Container();
    }

    return Scaffold(
      appBar: AppBar(
        title: Text('Camera Example'),
      ),
      body: Center(
        child: CameraPreview(_controller!),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.camera_alt),
        onPressed: () async {
          try {
            final XFile? picture = await _controller!.takePicture();

            if (mounted) {
              setState(() {});
            }

            // 如果需要,可以在这里处理图片,例如保存到本地或显示预览
          } catch (e) {
            print(e);
          }
        },
      ),
    );
  }
}

解释

  1. 权限请求:在AndroidManifest.xmlInfo.plist中请求相机权限。
  2. 依赖添加:在pubspec.yaml中添加camera插件依赖。
  3. 相机初始化:在initState方法中获取可用的相机列表,并初始化第一个相机。
  4. 相机预览:使用CameraPreview小部件显示相机预览。
  5. 拍照功能:通过_controller!.takePicture()方法拍照,并处理拍摄的图片。

这个示例展示了如何在Flutter应用中实现基本的相机功能。你可以根据需要进一步扩展,例如添加图片预览、保存到相册等功能。

回到顶部