首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有“状态”设计模式的Android Camera2 API

带有“状态”设计模式的Android Camera2 API
EN

Stack Overflow用户
提问于 2019-06-18 09:29:30
回答 1查看 578关注 0票数 2

我在不同的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:

  • 字段:包含设备、会话、字符、曲面、处理程序、锁、请求生成器、回调(捕获、会话、设备)
  • 方法: onOpenCamera,onCloseCamera,onCaptureCompleted

CameraState:

  • 混凝土: OpenState,CloseState,PreviewState,TakingPhotoState

问题:

  1. 有人用PoC api做camera2“状态”设计模式吗?这可行吗?
  2. 有使用并行计算(锁、线程)的状态设计模式吗?有什么想法吗,教程,你有篇文章吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-11 09:15:59

好的,我准备回答我的问题。我已经完成了这个想法的PoC。我为这类事情编写了某种SDK。我认为,这是非常有用的图书馆管理相机2 api调用。我不能分享存储库,因为我是为我的雇主做的(也许它最近会在互联网上找到)。但我可以分享一点知识。

作为项目的主要思想之一,我使用了一个“状态”设计模式(pattern),因为FSA溢出成许多块是很难维护的。

因此,我创建了以下状态:ClosedStateOpenedStateConfiguredStatePreviewStatePreCaptureCaptureCaptureBurstCameraContext是整个项目的主要类。所有州都继承自AbstractState

ClosedOpened状态非常简单。只有几行代码,非常具体。

Configured刚刚开始预览。

PreviewState具有捕获序列和捕获单个照片的功能(它调用了摄影师2的session.capturesession.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中,我们有四个不同和非常重要的回调需要实现:CameraSessionCallbackCameraStateCallbackCameraCaptureCallbackImageAvailableListener。因此,我创建了StateAware等效类,它们只是连接到cameraContext调用的桥梁(onCameraOpen of StateAwareCameraStateCallback calls onCameraOpen of CameraContext,后者调用onCameraOpen of ClosedState,等等)。这些回调被传递给Camera2API对象。

此外,项目还包含用于保存输出的ImageSavers和用于生成文件名的FilenameGenerators。我还添加了一些后处理突发。用仪器测试编写完整的PoC,而不使用演示应用程序则需要1MM。拍摄突发图像的测试场景需要100-150行自定义代码(打开、配置、准备突发、获取突发、关闭),我认为很容易理解/更改;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56645941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档