我在不同的Camera2 API项目中工作了2个月。正如您可能知道的,Camera2 API并不难理解和维护,它需要一些多处理、状态和回调的知识。在谷歌上拍照的简单例子有1000行(https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java)。在互联网上,也有非常混杂的实现,称为Camera3 https://github.com/QuinnFreedman/Camera3,它简化了Camera2的使用。
在我看到的几篇文章和示例中,Camera2应用程序的核心部分是机器自动机(FSA)。FSA是可以的,但是随着它变得很大,它很难理解、维护和扩展。解决方案是使用“状态”设计模式(pattern)。有保持状态的上下文对象,以及状态接口和具体状态(打开、关闭、预览、拍照)。
简单素描:
CamerContext:
CameraState:
问题:
发布于 2019-07-11 09:15:59
好的,我准备回答我的问题。我已经完成了这个想法的PoC。我为这类事情编写了某种SDK。我认为,这是非常有用的图书馆管理相机2 api调用。我不能分享存储库,因为我是为我的雇主做的(也许它最近会在互联网上找到)。但我可以分享一点知识。
作为项目的主要思想之一,我使用了一个“状态”设计模式(pattern),因为FSA溢出成许多块是很难维护的。
因此,我创建了以下状态:ClosedState
、OpenedState
、ConfiguredState
、PreviewState
、PreCapture
、Capture
和CaptureBurst
。CameraContext
是整个项目的主要类。所有州都继承自AbstractState
。
Closed
和Opened
状态非常简单。只有几行代码,非常具体。
Configured
刚刚开始预览。
PreviewState
具有捕获序列和捕获单个照片的功能(它调用了摄影师2的session.capture
、session.captureBurst
和session。
Capturing
状态,顾名思义,是负责拍照的(开始捕捉,完成捕获,并提供onimageavailable)。
我的捕获状态,保存对图像保护程序(或用于突发的图像保护程序)的引用,并在invoked可用调用期间调用。
在这些信息之后,时间描述相机的上下文。从维基百科你可能知道,它是所有电话的客户端。因此,它有很多方法: openCamera,createSession,startPreview,captureStillPic,captureSequence。还包括回调函数onCameraOpen、onCameraClose、onImageAvailable、on和on。其中一些方法只是特定于状态的方法的桥梁(onCameraOpen of CameraContext,is bridge to onCameraOpen of ClosedState,等等)。
更重要的是,在Camera2Api中,我们有四个不同和非常重要的回调需要实现:CameraSessionCallback
、CameraStateCallback
、CameraCaptureCallback
和ImageAvailableListener
。因此,我创建了StateAware等效类,它们只是连接到cameraContext调用的桥梁(onCameraOpen
of StateAwareCameraStateCallback
calls onCameraOpen
of CameraContext
,后者调用onCameraOpen
of ClosedState
,等等)。这些回调被传递给Camera2API对象。
此外,项目还包含用于保存输出的ImageSavers
和用于生成文件名的FilenameGenerators
。我还添加了一些后处理突发。用仪器测试编写完整的PoC,而不使用演示应用程序则需要1MM。拍摄突发图像的测试场景需要100-150行自定义代码(打开、配置、准备突发、获取突发、关闭),我认为很容易理解/更改;
https://stackoverflow.com/questions/56645941
复制相似问题