插件介绍
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 录像功能
使用 startVideoRecording 和 stopVideoRecording 方法来录像:
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),
),
);
}
}
注意事项
-
权限配置: 确保正确配置了相机和麦克风权限,否则应用将无法访问相机功能。
-
相机生命周期: 当应用进入后台或重新回到前台时,需要适当处理相机资源,避免资源泄漏。
-
分辨率设置: 根据设备性能和应用需求选择合适的分辨率,高分辨率会消耗更多资源。
-
错误处理: 使用相机功能时,应妥善处理可能出现的异常,提供友好的错误提示。
-
已知问题: 在鸿蒙平台上,调用
setDescriptionWhileRecording方法无效,会返回错误信息 “Camera switching is not supported while recording.”
总结
camera_ohos 是一个功能强大的 Flutter 插件,它为开发者提供了在鸿蒙平台上访问设备相机功能的便捷方式。通过本文的介绍,你已经了解了如何在鸿蒙应用中引入该插件、配置必要的权限、调用核心 API 以及管理相机生命周期。
使用 camera_ohos 插件,你可以轻松地在 Flutter 应用中实现各种相机功能,包括相机预览、拍照、录像以及各种相机参数控制。该插件的 API 设计与原生 camera 插件保持一致,因此如果你有使用原生 camera 插件的经验,将能够快速上手使用 camera_ohos 插件。
在实际开发中,建议结合示例代码和官方文档,根据应用的具体需求灵活使用该插件的各种功能,为用户提供流畅、专业的相机体验。

被折叠的 条评论
为什么被折叠?



