在Flutter中使用相机

使用相机的功能存在于许多应用程序中,我们都经常使用它。 在Flutter中,我们可以使用两个官方插件来实现相机的工作:



它们之间有明显的区别,您应该根据情况使用它们:


  • camera允许您与应用程序中设备可用的摄像头进行交互,并在小部件中显示图像。 当您需要为应用程序“定制”摄像机的操作时,它非常适合执行任务。
  • image-picker启动照相机应用程序,并将File类型(用户选择的图像或视频文件)的对象返回到您的应用程序。 此外, image-picker允许您从设备上可用的文件中选择文件,与此同时,像相机一样,启动单独的应用程序,然后将所选对象返回到您的应用程序中。



在这里您可以看到




摄影机


1.按照说明将插件添加到我们的项目中


操作系统的其他设置
的iOS
ios/Runner/Info.plist添加到ios/Runner/Info.plist


 <key>NSCameraUsageDescription</key> <string>Access to Camera</string> <key>NSMicrophoneUsageDescription</key> <string>Access to Microphone</string> 

安卓系统
确保文件android/app/build.gradle 21中的最低版本的Android sdk。


 minSdkVersion 21 

应用程序启动时将要求所有必要的权限。


在模拟器上工作
对于iOS,我们无法在模拟器上检查相机,我们需要一个“实时”设备。
Android会生成一个模拟(请参见下图),该模拟将替换相机镜头看到的内容。


标准插头


如果您不想看标准插头

在仿真器设置中,选择“高级设置”,然后为后置摄像头设置VirtualScene

我们重新启动模拟器。 现在,摄像机“显示”了虚拟房间,可以使用鼠标和wasd来移动它。

感谢Tonn_Tamerlan的提示。


2.我们传递给代码。 首先,我们使用availableCameras函数获取所有可用的摄像机。


 final cameras = await availableCameras(); 

此函数将返回可用摄像机的描述数组( List<CameraDescription> ),其中每个元素将包含摄像机的名称(可以只是索引),类型(后退,前置,外置)以及要旋转照片以使其出现在其中的角度他们的方向。


要控制摄像机,我们需要一个对象控制器(例如CameraController )来确定您需要指定接收的摄像机描述和分辨率(低,中,高)之一。


 void _setCameraController(CameraDescription cameraDescription) async { _controller = CameraController(cameraDescription, ResolutionPreset.medium); ... await _controller.initialize(); ... if (mounted) { setState(() {}); } } 

接下来,我们初始化控制器,并确保小部件“处于活动状态”,然后更新此小部件的状态。 ( 功能文字


我们将初始化的控制器传递给CameraPreview小部件


  AspectRatio( aspectRatio: _controller.value.aspectRatio, child: CameraPreview(_controller)) 

CameraPreview基于Texture小部件,该小部件负责显示来自相机的图片。 它的尺寸由父级确定,因此以某种纵横比确定子级尺寸的AspectRatio小部件是一种很好的方法。 我们从控制器_controller.value.aspectRatio获得比率。 结果,在界面中我们得到了一张图片


控制器初始化后的应用视图


3.现在我们可以拍照或拍摄视频。
一个 我们使用takePicture(String path)方法拍摄照片( 功能文本 )。 它会拍照并沿指定路径保存。


 Future<void> _takePhoto(BuildContext context) async { ... await _controller.takePicture(filePath); ... } 

要获取路径,我们需要官方的path_provider插件及其getApplicationDocumentsDirectory方法,该方法将返回一个私有目录。 接下来,我们确定要使用的目录的名称,如有必要,创建它,然后选择文件名:


  final Directory extDir = await getApplicationDocumentsDirectory(); final String dirPath = '${extDir.path}/Pictures/flutter_camera'; await Directory(dirPath).create(recursive: true); final String filePath = '$dirPath/${_getTimestamp()}.jpg'; 

拍摄照片之前,建议先确认控制器已初始化并且不再拍摄照片。


 if (!_controller.value.isInitialized) { return null; } ... if (_controller.value.isTakingPicture) { return null; } 

拍照了,我们有办法了,很高兴看到。 使用标准的Image小部件, File对象和文件路径,我们将图像显示在屏幕上。


 Image.file(File(filePath)) 

输出结果快照


b。 录制视频( 函数文本 )时,我们需要两个函数: startVideoRecording(String filePath)stopVideoRecording()


 Future<void> _startVideoRecording() async { ... await _controller.startVideoRecording(filePath); ... } Future<void> _stopVideoRecording(BuildContext context) async { ... await _controller.stopVideoRecording(); ... } 

startVideoRecording会按照指定的路径(通过与照片相同的原理获得)写入视频并将其保存, stopVideoRecording只是终止录制过程。 在开始录制之前,请确保不再进行拍摄。


 if (_controller.value.isRecordingVideo) { return null; } 

结果,我们有一个保存的视频及其路径。 要播放它,您将需要video_player插件。 与播放视频相关的所有代码都在单独的文件中提取。


在界面中录制和播放




图像选择器


1.按照说明将插件添加到我们的项目中


操作系统的其他设置
的iOS
ios/Runner/Info.plist添加到ios/Runner/Info.plist


 <key>NSCameraUsageDescription</key> <string>Access to Camera</string> <key>NSMicrophoneUsageDescription</key> <string>Access to Microphone</string> <key>NSPhotoLibraryUsageDescription</key> <string>Access to PhotoLibrary</string> 

在模拟器上工作
iOS中,我们无法在模拟器上检查相机,我们需要一个“实时”设备。


2. image-picker使用标准应用程序创建照片/视频或查看文件。 要启动所需的应用程序,必须对照片或pickVideo使用pickImage函数并指定source参数。


 ... final File video = await ImagePicker.pickVideo(source: ImageSource.camera); final File photo = await ImagePicker.pickImage(source: ImageSource.gallery); //  pickImage        ,       ... 

画廊和相机



我们的应用程序接收到选定的文件,但是如果未选择任何内容,则将返回null 。 为了显示图片和视频,我们使用与camera插件相同的方法。 对于图像,使用图像小部件-这次您无需将其包装在File ,因为我们最初收到的是这种类型的对象。


 Image.file(photo) 

对于视频插件video_player 。 与播放视频相关的所有代码都在单独的文件中提取。




结论


如您所见, image-picker易于使用,当您只需要将图像或视频传输到应用程序时,效果很好。 camera还为我们提供了所有必要的功能,用于自定义应用程序中使用摄像头的用户工作。
感谢您的阅读!

Source: https://habr.com/ru/post/zh-CN443336/


All Articles