在鸿蒙上使用 camera_ohos Flutter 包的指南

插件介绍

camera_ohos 是一个基于 camera@0.10.5+4 开发的 Flutter 插件,专门用于在鸿蒙平台上访问设备的相机功能。它提供了一套完整的 API,允许开发者轻松地在 Flutter 应用中实现相机预览、拍照、录像以及各种相机参数控制功能。

该插件支持的主要功能包括:

  • 相机预览显示
  • 拍照功能
  • 录像功能(支持暂停/恢复)
  • 闪光灯模式控制
  • 曝光模式和曝光补偿控制
  • 对焦模式和对焦位置控制
  • 缩放控制
  • 设备方向锁定

如何使用插件

1. 包的引入

由于这是一个自定义修改版本的三方库,需要以 git 形式引入。在项目的 pubspec.yaml 文件中添加以下依赖配置:

dependencies:
  camera_ohos:
    git:
      url: https://gitcode.com/openharmony-tpc/flutter_packages.git
      path: packages/camera/camera_ohos

然后执行 flutter pub get 命令来获取依赖包。

2. 权限配置

在鸿蒙平台上使用相机功能需要配置相应的权限。

2.1 在 module.json5 文件中添加权限

打开 entry/src/main/module.json5 文件,在 requestPermissions 数组中添加以下权限信息:

"requestPermissions": [
  {
    "name": "ohos.permission.CAMERA",
    "reason": "$string:reason",
    "usedScene": {
      "abilities": ["FormAbility"],
      "when": "inuse"
    }
  },
  {
    "name": "ohos.permission.MICROPHONE",
    "reason": "$string:reason",
    "usedScene": {
      "abilities": ["FormAbility"],
      "when": "inuse"
    }
  }
]
2.2 在 string.json 文件中添加权限申请原因

打开 entry/src/main/resources/base/element/string.json 文件,添加以下内容:

{
  "string": [
    {
      "name": "reason",
      "value": "需要访问相机和麦克风以实现拍照和录像功能"
    }
  ]
}

3. API 的调用

3.1 初始化相机

首先,需要获取可用的相机列表,然后选择一个相机进行初始化:

// 获取可用相机列表
List<CameraDescription> cameras = await CameraPlatform.instance.availableCameras();

// 选择第一个后置相机
CameraDescription firstCamera = cameras.firstWhere(
  (camera) => camera.lensDirection == CameraLensDirection.back,
  orElse: () => cameras.first, // 如果没有后置相机,使用第一个可用相机
);

// 创建相机控制器
CameraController controller = CameraController(
  firstCamera,
  ResolutionPreset.high, // 设置分辨率
  enableAudio: true, // 是否启用音频
);

// 初始化相机
await controller.initialize();
3.2 显示相机预览

使用 CameraPreview 组件来显示相机预览:

Widget build(BuildContext context) {
  return CameraPreview(controller);
}
3.3 拍照功能

使用 takePicture 方法来拍照:

Future<void> takePicture() async {
  try {
    XFile file = await controller.takePicture();
    print('照片保存路径: ${file.path}');
    // 处理拍摄的照片
  } on CameraException catch (e) {
    print('拍照失败: ${e.code} - ${e.description}');
  }
}
3.4 录像功能

使用 startVideoRecordingstopVideoRecording 方法来录像:

Future<void> startRecording() async {
  try {
    await controller.startVideoRecording();
  } on CameraException catch (e) {
    print('开始录像失败: ${e.code} - ${e.description}');
  }
}

Future<void> stopRecording() async {
  try {
    XFile file = await controller.stopVideoRecording();
    print('视频保存路径: ${file.path}');
    // 处理录制的视频
  } on CameraException catch (e) {
    print('停止录像失败: ${e.code} - ${e.description}');
  }
}
3.5 相机参数控制

闪光灯模式控制:

// 设置闪光灯模式
avoid setFlashMode(FlashMode mode) async {
  await controller.setFlashMode(mode);
}

// 示例:开启闪光灯
setFlashMode(FlashMode.torch);

对焦模式控制:

// 设置对焦模式
await controller.setFocusMode(FocusMode.auto);

// 设置对焦位置
await controller.setFocusPoint(const Offset(0.5, 0.5)); // 屏幕中心

曝光控制:

// 设置曝光模式
await controller.setExposureMode(ExposureMode.auto);

// 设置曝光补偿
await controller.setExposureOffset(1.0); // 增加曝光

缩放控制:

// 设置缩放级别
await controller.setZoomLevel(2.0); // 放大2倍

4. 相机生命周期管理

在应用生命周期变化时,需要适当处理相机资源:


void didChangeAppLifecycleState(AppLifecycleState state) {
  if (controller == null || !controller.value.isInitialized) {
    return;
  }

  if (state == AppLifecycleState.inactive) {
    controller.dispose(); // 应用进入后台时释放相机资源
  } else if (state == AppLifecycleState.resumed) {
    _initializeCameraController(controller.description); // 应用回到前台时重新初始化相机
  }
}

完整示例

下面是一个简单但完整的示例,展示了如何在鸿蒙应用中使用 camera_ohos 包:

import 'package:flutter/material.dart';
import 'package:camera_ohos/camera_ohos.dart';
import 'package:camera_platform_interface/camera_platform_interface.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const CameraApp());
}

class CameraApp extends StatelessWidget {
  const CameraApp({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Camera Example',
      home: CameraExampleHome(),
    );
  }
}

class CameraExampleHome extends StatefulWidget {
  
  State<CameraExampleHome> createState() => _CameraExampleHomeState();
}

class _CameraExampleHomeState extends State<CameraExampleHome> {
  late CameraController _controller;
  late Future<void> _initializeControllerFuture;
  bool _isRecording = false;

  
  void initState() {
    super.initState();
    _initCamera();
  }

  Future<void> _initCamera() async {
    // 获取可用相机列表
    final cameras = await CameraPlatform.instance.availableCameras();
    // 选择第一个后置相机
    final firstCamera = cameras.firstWhere(
      (camera) => camera.lensDirection == CameraLensDirection.back,
      orElse: () => cameras.first,
    );

    // 创建相机控制器
    _controller = CameraController(
      firstCamera,
      ResolutionPreset.high,
      enableAudio: true,
    );

    // 初始化相机
    _initializeControllerFuture = _controller.initialize();
  }

  
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Camera Example')),
      body: FutureBuilder<void>(
        future: _initializeControllerFuture,
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            // 如果初始化成功,显示相机预览
            return CameraPreview(_controller);
          } else {
            // 否则显示加载指示器
            return const Center(child: CircularProgressIndicator());
          }
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          try {
            // 确保相机已初始化
            await _initializeControllerFuture;

            if (!_isRecording) {
              // 开始录像
              await _controller.startVideoRecording();
              setState(() => _isRecording = true);
            } else {
              // 停止录像
              final videoFile = await _controller.stopVideoRecording();
              setState(() => _isRecording = false);
              print('视频保存路径: ${videoFile.path}');
            }
          } catch (e) {
            print('相机操作失败: $e');
          }
        },
        child: Icon(_isRecording ? Icons.stop : Icons.videocam),
      ),
    );
  }
}

注意事项

  1. 权限配置: 确保正确配置了相机和麦克风权限,否则应用将无法访问相机功能。

  2. 相机生命周期: 当应用进入后台或重新回到前台时,需要适当处理相机资源,避免资源泄漏。

  3. 分辨率设置: 根据设备性能和应用需求选择合适的分辨率,高分辨率会消耗更多资源。

  4. 错误处理: 使用相机功能时,应妥善处理可能出现的异常,提供友好的错误提示。

  5. 已知问题: 在鸿蒙平台上,调用 setDescriptionWhileRecording 方法无效,会返回错误信息 “Camera switching is not supported while recording.”

总结

camera_ohos 是一个功能强大的 Flutter 插件,它为开发者提供了在鸿蒙平台上访问设备相机功能的便捷方式。通过本文的介绍,你已经了解了如何在鸿蒙应用中引入该插件、配置必要的权限、调用核心 API 以及管理相机生命周期。

使用 camera_ohos 插件,你可以轻松地在 Flutter 应用中实现各种相机功能,包括相机预览、拍照、录像以及各种相机参数控制。该插件的 API 设计与原生 camera 插件保持一致,因此如果你有使用原生 camera 插件的经验,将能够快速上手使用 camera_ohos 插件。

在实际开发中,建议结合示例代码和官方文档,根据应用的具体需求灵活使用该插件的各种功能,为用户提供流畅、专业的相机体验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值