
Android 传感器让应用可以访问移动设备的底层物理传感器。它们是由 sensors.h(传感器硬件抽象层 (HAL))定义的数据提供型虚拟设备。
什么是 Android 传感器?
Android 传感器是虚拟设备,可提供来自一组物理传感器的数据:加速度计、陀螺仪、磁力计、气压计、湿度传感器、压力传感器、光线传感器、接近传感器和心率传感器。
未包含在提供数据的物理设备列表中的是摄像头、指纹传感器、麦克风和触摸屏。这些设备有自己的报告机制;这种划分是人为的,但总的来说,Android 传感器提供较低带宽的数据。例如,加速度计为“100hz x 3 通道”,而摄像头为“25hz x 8 MP x 3 通道”,麦克风为“44kHz x 1 通道”。
Android 没有定义不同的物理传感器如何连接到片上系统 (SoC)。
- 通常,传感器芯片通过传感器 Hub 连接到 SoC,从而可以对数据进行一些低功耗监控和处理。
- 通常,内部集成电路 (I2C) 或串行外围接口 (SPI) 用作传输机制。
- 为了降低功耗,一些架构是分层的,在专用集成电路 (ASIC - 如加速度计芯片上的运动检测) 中完成一些最少的处理,而在微控制器 (如传感器 Hub 中的步数检测) 中完成更多处理。
- 设备制造商可以根据精度、功耗、价格和封装尺寸特性来选择架构。有关更多信息,请参阅传感器堆栈。
- 批量处理能力是功耗优化的重要考虑因素。有关更多信息,请参阅批量处理。
每个 Android 传感器都有一个“类型”,表示传感器的行为方式及其提供的数据。
- 官方 Android 传感器类型在 sensors.h 中以 SENSOR_TYPE_… 名称定义。
- 绝大多数传感器都有官方传感器类型。
- 这些类型在 Android SDK 中有文档记录。
- 具有这些类型的传感器的行为在 Android 兼容性测试套件 (CTS) 中进行测试。
- 如果制造商在 Android 设备上集成了新型传感器,则制造商可以定义自己的临时类型来指代它。
- 这些类型没有文档记录,因此应用程序开发人员不太可能使用它们,要么是因为他们不知道这些类型,要么是知道它们很少存在(仅在来自这家特定制造商的某些设备上)。
- 它们未通过 CTS 测试。
- 一旦 Android 为这种传感器定义了官方传感器类型,制造商必须停止使用他们自己的临时类型,而改用官方类型。这样,该传感器将被更多应用程序开发人员使用。
- 设备上存在的所有传感器的列表由 HAL 实现报告。
Android 传感器以一系列传感器事件的形式提供数据。
每个事件包含
- 生成该事件的传感器的句柄
- 检测或测量到事件的时间戳,基于
SystemClock.elapsedRealtimeNanos()
- 以及一些数据
报告数据的解释取决于传感器类型。有关每种传感器类型报告的数据的详细信息,请参阅传感器类型定义。
现有文档
面向开发者
- 概览
- SDK 参考
- Stack Overflow 和教程网站
- 由于传感器文档有时缺乏,开发者求助于 Stack Overflow 等问答网站来寻找答案。
- 也存在一些教程网站,但未涵盖最新的功能,如批量处理、显著运动和游戏旋转矢量。
- 那里的答案并不总是正确的,并表明需要更多的文档。
面向制造商
- 概览
- 此传感器页面及其子页面。
- 硬件抽象层 (HAL)
- /platform/hardware/libhardware/+/main/include/hardware/sensors.h
- 也称为“sensors.h”
- 真理之源。开发新功能时要更新的第一个文档。
- Android CDD(兼容性定义文档)
- /compatibility/android-cdd.pdf
- 请参阅与传感器相关的部分。
- CDD 比较宽松,因此满足 CDD 要求不足以确保高质量的传感器。