Generic Sensor API 提供了一组属性和方法,将传感器暴露给 Web 端应用。在这个标准中,规定了基本的接口和类,使得在实现各种传感器 API 时能够通过继承快速实现。在介绍完本标准后,我会举例使用其中一个传感器 API。
与 DeviceMotion 和 DeviceOrientation 这些已有的能够提供传感器数据的 API 相比之下,Generic Sensor API 体现出了许多好处:
- Generic Sensor API 能够非常容易地扩展出新的传感器类,同时,扩展出的新类与父类接口保持一致。由于这些一致性,用于一个传感器的代码经过少量修改之后即可用于另一个传感器上
- 你可以配置传感器,例如,设置适合你的应用的采样率
- 你可以检测某个传感器是否可用
- 传感器读数有着精度非常高的时间戳,使用高精度的时间戳可以与应用中的额其他活动进行同步
- 传感器数据模型以及坐标系统有这非常明确的定义,使得浏览器厂商能够实现具有互通性的解决方案
- 基于 Generic Sensor API 的接口不依赖 DOM 相关对象 (Navigator 以及 Window 对象),这给未来在 Service Worker,无头 JS 运行时(如嵌入式设备)带来应用的可能
- 相对于旧的 API,Generic Sensor API 还带来了更好的安全和隐私保护能力
类名 | 传感器 |
---|---|
Accelerometer | 加速度计 |
Gyroscope | 陀螺仪 |
LinearAccelerationSensor | 线性加速传感器 |
AbsoluteOrientationSensor | 绝对方向传感器 |
RelativeOrientationSensor | 相对方向传感器 |
AmbientLightSensor | 环境光传感器 |
Magnetometer | 磁力计 |
接下来我们来详细了解 Generic Sensor API 中的属性和方法
首先构建传感器对象,进入空闲状态,调用 start
方法之后进行激活(激活中状态),如果发生错误,则回到空闲状态,成功则进入已激活状态。调用 stop
或出错,则返回空闲状态。
- 当传感器属于“激活中”的状态并且注册了
activated
,reading
,error
事件时不会被回收 - 当传感器属于“已激活”的状态并且注册了
reading
,error
事件时不会被回收
SensorOptions
是用于在构建传感器对象时传入的配置项,在 Generic Sensor API 的基类中支持一种设置
设置 | 作用 |
---|---|
frequency | 采样率,单位 Hz |
该属性用于检测当前传感器是否属于已激活的状态,是则返回 true
该属性首先会检查最近一次读数的时间戳,如果有则返回 true
该属性用于读取最近一次读数的时间戳的值
start
方法会开始对传感器数据进行采样,采样率可以在构建传感器对象时通过参数传入。
如果平台与传感器之间无法建立连接,将会抛出 NotReadableError
异常;
如果平台没有访问传感器的权限,将会抛出NotAllowedError
异常
stop
方法将会停止对传感器的数据采样,并将传感器置为空闲状态
当调用 start
方法之后,根据设定的采样率,将会按照采样率采样数据并通过该事件通知产生了读数
在传感器的生命周期中,如果状态从 activating
变更到 activated
时将会触发此事件
当操作传感器时或传感器出现异常时将会通过此事件抛出
现在,我们将使用 AmbientLightSensor
为例,制作一个简单的页面,根据返回的数值(光照度 lux)改变背景,小于 100 lux 时变为黑色背景。
首先通过简单的检查,查看当前平台是否支持此传感器
if (window.AmbientLightSensor) {
...
} else {
...
}
const als = new AmbientLightSensor();
als.addEventListener('reading', () => {
...
})
als.start();
通过在 reading
事件中判断光照度,动态改变界面样式
如果没有成功读取数值,先尝试在 flags 中将 Generic Sensor Extra Classes 开启:
在 Chrome 中,一部分传感器实现已经是默认开启了,例如 Gyroscope
, Magnetometer
等。通过传感器数据,在 Web 端将能实现更多更好的交互。