我想在我的安卓手机上控制光圈、快门速度和 ISO。有没有办法可以访问硬件功能?
2 回答
我不会说不可能做到这一点,但实际上不可能以一种适用于所有——甚至许多——Android手机的方式来做到这一点。如果您偏离了由 Android API 定义的官方路径,那么您几乎只能靠自己,这基本上是一个嵌入式硬件开发项目。
让我们从基础开始:您需要相机子系统的示意图和图像管道中所有内容的数据表。对于您打算支持的每部手机。在某些情况下,您可能会发现一些手机具有或多或少相同的摄像头子系统(特别是当您谈论在美国销售的运营商特定型号略有不同时),有时您可能会幸运地拥有很多您关心的手机与 Nexus 手机之间的相似性。
这是一个不小的壮举。据我所知,即使是 NEXUS 手机也没有发布官方原理图。流行的手机(尤其是三星和 HTC)通常会发布拆解信息,因此每个人都知道大致的细节(相机模块、视频编码芯片组等),但要弄清楚它们是如何连接在一起的,仍然有很多猜测。
别搞错了——这不是随便的黑客领域。如果 I2C、SPI、MMC 和 iDCT 之类的术语对您来说毫无意义,那么您可能不会走得太远。如果您不了解如何串行读取 CMOS 图像传感器,以及如何使用拜耳阵列生成 RGB 图像,那么您几乎可以肯定是在头上。
这并不意味着您应该认输并放弃……但这确实意味着尝试破解商用 Android 手机上的摄像头可能不是最好的起点。为了完成这样的项目,您需要大量背景知识,并且您确实需要从您控制并拥有适当文档的硬件平台获取这些知识。毫无疑问……在“硬”Android 软件项目的层次结构中,这非常接近列表的顶部。
我的建议(简化和浓缩一点):购买一个 Raspberry Pi,并学习如何从 GPIO 引脚点亮 LED。然后学习如何通过 74HC595 移位寄存器有选择地点亮 8 个 LED。然后在分线板上购买一个 SPI 寻址的闪存芯片,并学习如何对其进行写入。在某个时候,从 Sparkfun.com 之类的人那里购买具有“串行”(fyi,“串行”!=“rs232”)接口的视频图像传感器,并学习如何一次读取一帧,并转储原始 RGB 数据闪烁。了解如何使用 i2c 读取和写入相机的控制寄存器。此时,您可能已经准备好使用 Android 手机中的相机拍摄单张照片了。
如果您决定从 Android 手机入手,至少现在坚持使用“Nexus”设备,并且在您拥有原理图、数据表和源代码之前不要购买手机(如果您还没有手机)你拥有的。不要以为您可以自己追踪原理图而购买手机。你不会的。至少,除非您是一名研究生并且拥有一个研究生级别的电子实验室(具有 X 射线功能)供您使用。这些芯片和模块大部分是微型BGA。你不会用万用表来追踪它们,而且我所知道的每个 Android 摄像头的大部分低级驱动程序逻辑都隐藏在源不可用的可加载内核模块中。
也就是说,我非常希望看到有人完成这样的项目。:-)
Android 已发布在线培训,其中包含您需要的所有信息: 您可以在此处找到它 - 媒体 API
但是,存在局限性,并非所有硬件都支持所有类型的参数。如果我没记错的话,你无法控制快门速度和 ISO。