修复Android Camera API

前几天,我参加了公司的黑客马拉松,我决定使用Android相机。 我一直说Android API非常糟糕(说得有点客气),但我从未真正尝试过明确地指出什么是错以及如何更好。 到现在。

因此, Camera API很糟糕。 如果您以前从未看过,请看一分钟。 您可能以许多错误的方式使用它,您可能忘记了许多重要的事情,即使使用stackoverflow,也无法轻易发现问题所在,而且感觉也不佳。 换句话说,API有点问题,要求您阅读10个步骤的列表,其中一些步骤突出显示为“重要”。 您将如何编写该API? 让我们改善它。

所以我做到了–我的EasyCamera包装器在GitHub上 。 以下是我所做的更改以及更改的原因:

  1. setPreviewDisplay(..)startPreview()之前是必需的,而在拍照之前则是必需的。 为什么不执行呢? 我们可以简单地抛出一个异常“未设置预览显示”,但这还不够好。 让我们摆脱设置预览显示的方法,然后使startPreview(..)将该表面作为参数。 重载它也可以采用SurfaceTexture
  2. 我们已经强制执行了预览设置,所以现在让我们强制开始预览。 我们可以再次从takePicture(..)抛出“未开始预览”异常,但这在运行时发生。 相反,让我们摆脱Camera类中的takePicture(..)方法,并将其放入CameraActions类中。 与仅在预览开始后才有效的其他方法一起使用(我不知道它们到底是什么-从当前API尚不清楚)。 我们如何获取CameraActions实例? 它由startPreview(..)返回
  3. 到目前为止,我们已经通过执行正确的步骤来使主要用例变得简单明了且不易出错。 但是takePicture(..)方法仍然让人感到奇怪。 您可以为所有参数提供null,但是不知何故有两种重载方法。 可以说,传递null可以,但是还有其他选择。 一种是引入一个PictureCallback接口,该接口具有可以调用的所有四个方法,并在BasePictureCallback类中提供所有这些方法的空白实现。 但是,这可能不适用于这种情况,因为如果您传递null与不执行任何操作的回调(至少在我的手机上,如果我通过快门回调,则播放快门声音,以及如果通过null,不是)。 因此,让我们介绍一下Callbacks ,它是一个类似于构建器的类,其中包含您喜欢的所有回调。
  4. 到目前为止一切正常,但是您需要在拍照后重新开始预览。 自动重启可能不是一个好的默认设置。 但是在我们所处的情况下,您只有CameraActions ,现在调用startPreview(..)需要传递一个曲面。 我们应该引入restartPreview()方法吗? 不能。我们可以使我们的接口方法返回boolean,如果开发人员想要重新启动预览,则它们应该只返回true 。 如果没有4个不同的回调,那会很好,并且基于所有4个回调计算结果是很棘手的。 这就是为什么明智的选择是将restartPreview属性添加到Callbacks类,并且仅在调用了最后一个回调之后并且仅在该属性设置为true时才重新启动。
  5. 现在主要流程已得到改进,但还有其他方面需要改进。 例如,打开和关闭相机的方法之间存在不对称性。 “打开”和“释放”。 它应该是“打开”和“关闭”或“获取”和“释放”。 我更喜欢使用.close() ,然后(如果可以使用Java 7)使用AutoClosable接口,并因此使用try-with-resource构造。
  6. 调用getParameters() ,可以复制参数。 可以,但是您应该将它们放回原先的位置,这是违反直觉的。 提供一个简单的camera.setParameter(..)方法将更容易使用,但是Parameters类具有很多方法,因此不能将其带入Camera类。 我们可以使参数可变吗? (尚未实现)
  7. API使用起来如此繁琐的原因之一是错误报告。 无论出于何种原因,您几乎都将“ Came.takePicture失败”。 通过上述步骤,在某些情况下我们消除了对异常的需要,但是最好获得确切原因的更好报告。
  8. 我们需要使Camera模拟友好( 当前不是 )。 因此EasyCamera是一个界面,您可以轻松地对其进行模拟。 CameraActions也是一个简单的可模拟类。

我的EasyCamera项目现在只是一个初始版本,尚未在生产代码中使用,但我想获得有关它是否比原始版本更好以及如何对其进行改进的反馈。 在某些时候,它可以包装其他麻烦的相机功能,例如前置和后置摄像头等。

API损坏是造成数百小时,金钱和神经元浪费的原因。 这就是为什么在设计API时需要一些非常特定的技能,并且需要问自己很多问题。 Josh Bloch关于API设计的演讲非常相关,我建议您这样做。 我实际上违反了他的建议之一–“如有疑问,请不要理会” –您可以在CameraActions中访问整个Camera,这可能使您无法执行任何操作。 但是,我并不完全了解Camera的所有功能,这就是为什么我不想限制用户并使他们发明笨拙的解决方法的原因。

当我开始写这篇文章时,我并不打算实际写EasyCamera。 但是事实证明,这需要2个小时,所以我做到了。 而且我建议开发人员在遇到不良API时,都要进行上述练习-考虑如何编写它。 这样一来,实际修复或包装它可能要比直接使用它要少得多。

翻译自: https://www.javacodegeeks.com/2014/04/fixing-the-android-camera-api.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值