环境光传感器

W3C 工作草案,

关于本文档的更多详细信息
本版本:
https://www.w3.org/TR/2026/WD-ambient-light-20260514/
最新发布版本:
https://www.w3.org/TR/ambient-light/
编辑草案:
https://w3c.github.io/ambient-light/
先前版本:
历史:
https://www.w3.org/standards/history/ambient-light/
反馈:
public-device-apis@w3.org 主题行使用“[ambient-light] … 消息主题 …”(存档
GitHub
测试套件:
https://github.com/web-platform-tests/wpt/tree/master/ambient-light
编辑:
Anssi KostiainenIntel Corporation
Rijubrata BhaumikIntel Corporation
前任编辑:
Tobie LangelCodespeaks,曾代表 Intel Corporation
Doug TurnerMozilla Corporation
问题跟踪:
Level 2 问题

摘要

本规范定义了一个具体的传感器接口,用于监测设备环境的 环境光级别或照度。

本文档状态

本节描述本文档在其发布时的状态。当前 W3C 出版物列表以及本技术报告的最新修订版 可在 W3C 技术报告 索引中找到。

本文档由 Devices and Sensors Working Group 作为工作草案使用 推荐 轨道发布。本文档旨在成为 W3C 推荐标准。

如果你希望就本文档发表评论,请发送至 public-device-apis@w3.org订阅存档)。 发送电子邮件时, 请将文本“ambient-light”放入主题中, 最好采用如下形式: “[ambient-light] …评论摘要…”。 欢迎所有评论。

作为工作草案发布并不意味着 W3C 及其成员认可该文档。这是一个草案文档,可能会 随时被其他文档更新、替换或 废弃。除作为进行中的工作外,不宜引用 本文档。

本文档由一个根据 W3C 专利政策运作的组制作。 W3C 维护了一个与该组交付物相关的任何专利 披露的公开列表; 该页面还包含披露专利的说明。 实际知晓某项专利且认为该专利包含必要权利要求的个人 必须按照 W3C 专利政策第 6 节披露该信息。

本文档受 2025 年 8 月 18 日 W3C 流程文档管辖。

本规范在任何浏览器引擎中默认都不可用。 预计其当前形式不会推进到 W3C 推荐标准。

Devices and Sensors Working Group 正在为本规范寻求现代安全与隐私 审查,以考虑自水平审查 于 2017 年 10 月 3 日进行以来, 本规范以及隐私和安全审查实践中发生的大量变化。类似地,该组正在寻求更新本规范的 Technical Architecture Group 审查,以体现最新的 架构审查实践。

1. 引言

Ambient Light Sensor 扩展了 Generic Sensor API [GENERIC-SENSOR], 以按 lux 单位提供由设备主光检测器检测到的 环境光级别信息。

1.1. 范围

本文档规定了一个 API,其设计面向用例, 这些用例需要细粒度的照度数据、低延迟,并且可能 以高频率采样。

依赖少量照度值的常见用例,例如根据对比度级别或首选配色方案 对网页进行样式设置,而这些可能受设备测得的环境光级别影响, 最好由 prefers-contrastprefers-color-scheme CSS 媒体特性 [MEDIAQUERIES-5] 以及随附的 matchMedia API [CSSOM-VIEW-1] 提供, 并且不属于本 API 的范围。

注:[MEDIAQUERIES-5] 规范曾经 包含一个 light-level 媒体特性,它与环境光读数更直接相关。后来它已从该规范中 移除, 转而采用更高层级的 prefers-color-schemeprefers-contrast 媒体特性。

2. 示例

在这个简单示例中,会使用默认配置创建环境光传感器。 每当新的读数可用时, 就会将其打印到控制台。
const sensor = new AmbientLightSensor();
sensor.onreading = () => console.log(sensor.illuminance);
sensor.onerror = event => console.log(event.error.name, event.error.message);
sensor.start();
在此示例中,根据环境光传感器读数计算 ISO 100 下的曝光值(EV)。 最初,我们会检查用户代理是否有权访问环境光传感器读数。 然后, illuminance 值会被转换为 最接近的曝光值。
navigator.permissions.query({ name: 'ambient-light-sensor' }).then(result => {
    if (result.state === 'denied') {
        console.log('Permission to use ambient light sensor is denied.');
        return;
    }

    const als = new AmbientLightSensor({frequency: 20});
    als.addEventListener('activate', () => console.log('Ready to measure EV.'));
    als.addEventListener('error', event => console.log(`Error: ${event.error.name}`));
    als.addEventListener('reading', () => {
        // Defaut ISO value.
        const ISO = 100;
        // Incident-light calibration constant.
        const C = 250;

        let EV = Math.round(Math.log2((als.illuminance * ISO) / C));
        console.log(`Exposure Value (EV) is: ${EV}`);
    });

    als.start();
});
此示例演示如何将环境光传感器读数 映射到推荐的工作场所照明级别。
const als = new AmbientLightSensor();

als.onreading = () => {
    let str = luxToWorkplaceLevel(als.illuminance);
    if (str) {
        console.log(`Light level is suitable for: ${str}.`);
    }
};

als.start();

function luxToWorkplaceLevel(lux) {
    if (lux > 20 && lux < 100) {
        return 'public areas, short visits';
    } else if (lux > 100 && lux < 150) {
        return 'occasionally performed visual tasks';
    } else if (lux > 150 && lux < 250) {
        return 'easy office work, classes, homes, theaters';
    } else if (lux > 250 && lux < 500) {
        return 'normal office work, groceries, laboratories';
    } else if (lux > 500 && lux < 1000) {
        return 'mechanical workshops, drawing, supermarkets';
    } else if (lux > 1000 && lux < 5000) {
        return 'detailed drawing work, visual tasks of low contrast';
    }

    return;
}

3. 安全与隐私考量

这里存在一个跟踪向量。 Ambient Light Sensor 提供关于设备环境附近 照明条件的信息。潜在隐私风险包括:

[ALSPRIVACYANALYSIS][PINSKIMMINGVIASENSOR][STEALINGSENSITIVEDATA][VIDEORECOGNITIONAMBIENTLIGHT][IMAGINGPRIVACY] 等工作进一步深入讨论了 这些问题。

为了缓解 Ambient Light Sensor 特有的这些威胁,用户代理必须 降低传感器读数的精度。用户代理还可以限制 最大采样频率

这些缓解策略补充了 Generic Sensor API [GENERIC-SENSOR] 中定义的通用 缓解措施

3.1. 降低传感器读数精度

降低传感器读数的精度,本规范定义了 一个阈值检查算法环境光阈值检查算法)以及一个 读数量化算法环境光读数量化 算法)。

这些算法使用照度舍入倍数照度阈值。实现必须遵守 以下有关其值的 要求:

注:选择照度舍入 倍数需要在避免暴露过于精确的读数与同时提供 对 API 用户仍然有用的读数之间取得平衡。50 lux 作为 照度舍入倍数最小值,是在 GitHub issue #13 中确定的,当时在不同照明条件下的不同环境光级别测量值被收集 ,并显示可阻止 [STEALINGSENSITIVEDATA] 中描述的攻击。 50 lux 也高于使使用环境光传感器读数进行视频识别([VIDEORECOGNITIONAMBIENTLIGHT])不可行所需的 5 lux。

注:照度阈值用于防止泄露 读数在某一特定值附近徘徊但被量化为 不同值这一事实。例如,如果照度舍入倍数为 50, 这可防止当原始读数在 24 和 26 之间切换时, 照度值在 0 和 50 之间切换。阈值检查算法作为 辅助指纹缓解策略的有效性尚未得到数学证明, 但基于实现经验已将其加入本规范。Chromium bug 1332536Chromium review 3666917 包含更多 相关信息。

4. 模型

Ambient Light Sensor 传感器类型的关联 Sensor 子类是 AmbientLightSensor 类。

Ambient Light Sensor 具有一个默认传感器, 即设备的主光检测器。

Ambient Light Sensor 是一个由 名称 "ambient-light-sensor" 标识的强大特性, 这也是其关联的传感器权限名称。其 权限撤销算法是使用 "ambient-light-sensor" 调用 通用传感器权限撤销 算法所得的结果。

Ambient Light Sensor 是一个由字符串 "ambient-light-sensor" 标识的策略控制特性。其默认允许列表'self'

Ambient Light Sensor 具有一个虚拟传感器类型,即 "ambient-light"。

当前光照 级别照度 是表示托管设备周围环境光级别的值。 其单位为 lux(lx)[SI]

注:不同设备在相同光照下报告的 精确 lux 值可能不同, 这是由于检测方法、传感器构造等方面的差异。

Ambient Light Sensor 具有一个以 lux 为单位测量的照度舍入 倍数,它表示照度读数将向其倍数 舍入的一个数。

Ambient Light Sensor 具有一个以 lux 为单位测量的照度阈值, 它用于环境光阈值检查算法

注:§ 3.1 降低传感器读数精度,了解上述值的最低要求。

5. API

5.1. AmbientLightSensor 接口

[SecureContext, Exposed=Window]
interface AmbientLightSensor : Sensor {
  constructor(optional SensorOptions sensorOptions = {});
  readonly attribute double? illuminance;
};

为构造一个 AmbientLightSensor 对象,用户代理必须调用 构造环境光传感器对象 抽象操作。

5.1.1. illuminance 属性

illuminance getter 步骤为:

  1. illuminance 为以 this 和 "illuminance" 为参数调用 从最新读数获取值所得的结果。

  2. 返回 illuminance

6. 抽象操作

6.1. 构造环境光传感器对象

输入

options,一个 SensorOptions 对象。

输出

一个 AmbientLightSensor 对象。

  1. allowed 为以 AmbientLightSensor 调用 检查传感器策略控制 特性所得的结果。

  2. 如果 allowed 为 false,则:

    1. 抛出一个 SecurityError DOMException

  3. ambient_light_sensor 为新的 AmbientLightSensor 对象。

  4. ambient_light_sensoroptions 调用 初始化传感器对象

  5. 返回 ambient_light_sensor

6.2. 环境 光阈值检查算法

Ambient Light Sensor 传感器类型定义了以下阈值检查算法

输入

newReading,一个传感器 读数

latestReading,一个传感器 读数

输出

一个布尔值,指示读数差异是否 足够显著。

  1. 如果 newReading["illuminance"] 为 null,返回 true。

  2. 如果 latestReading["illuminance"] 为 null,返回 true。

  3. newIlluminancenewReading["illuminance"]。

  4. latestIlluminancelatestReading["illuminance"]。

  5. 如果 abs(latestIlluminance - newIlluminance) < 照度阈值,返回 false。

  6. roundedNewReading 为以 newIlluminance 调用环境光读数 量化算法算法所得的结果。

  7. roundedLatestReading 为以 latestIlluminance 调用环境光读数 量化算法算法所得的结果。

  8. 如果 roundedNewReading["illuminance"] 和 roundedLatestIlluminance["illuminance"] 相等,返回 false。

  9. 否则,返回 true。

注:此算法调用环境光读数量化 算法,以确保舍入到相同值的读数不会在主更新 最新读数算法中 触发更新。不这样做将向用户表明 原始照度读数处于某个范围内,在该范围中它们的差异 至少达到照度阈值,但并不会 舍入到不同的照度舍入倍数

6.3. 环境光读数量化算法

Ambient Light Sensor 传感器类型定义了以下读数量化算法

输入

reading,一个传感器 读数

输出

一个传感器读数

  1. quantizedReadingreading

  2. quantizedReading["illuminance"] 设为 reading["illuminance"] 最接近的照度舍入倍数的倍数。

  3. 返回 quantizedReading

7. 自动化

本节通过提供 Ambient Light Sensor 特定的虚拟传感器元数据, 扩展了 Generic Sensor API § 9 自动化

给定一个 JSON Object parameters照度读数解析算法必须返回以 parameters 和 "illuminance" 调用解析单值数字读数所得的结果。

按类型虚拟传感器元数据映射 必须具有以下条目

"ambient-light"

一个虚拟传感器元数据,其读数解析算法照度读数解析算法

8. 用例和需求

虽然某些用例可能受益于获取精确的环境光测量值,但 将环境光级别波动转换为用户输入事件的用例将受益于 更高的采样频率

9. 致谢

感谢 Doug Turner 提供初始原型, 感谢 Marcos Caceres 提供测试套件。

感谢 Paul Bakaus 提出 LightLevelSensor 构想。

感谢 Mikhail Pozdnyakov 和 Alexander Shalamov 提供用例和需求。

感谢 Lukasz Olejnik 进行隐私风险评估。

一致性

文档 约定

一致性要求通过描述性断言 与 RFC 2119 术语的组合来表达。 本文档规范性部分中的关键词“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、 “MAY”和“OPTIONAL” 应按 RFC 2119 中的描述来解释。 但是,为了可读性, 这些词在本规范中并非全部以大写字母出现。

本规范的所有文本都是规范性的, 除非某些章节明确标记为非规范性、示例和注释。[RFC2119]

本规范中的示例由“例如”一词引入, 或使用 class="example" 与规范性文本分开设置, 如下所示:

这是一个资料性示例。

资料性注释以“注”一词开头, 并使用 class="note" 与规范性文本分开设置, 如下所示:

注,这是一个资料性注释。

一致性 算法

作为算法一部分以祈使语气表述的要求 (例如“剥离任何前导空格字符” 或“返回 false 并中止这些步骤”) 应按引入该算法时所使用的关键词 (“must”、“should”、“may”等)的含义来解释。

以算法或特定步骤表述的一致性要求 可以用任何方式实现, 只要最终结果等价即可。 尤其是,本规范中定义的算法 旨在易于理解, 并非旨在具备高性能。 鼓励实现者进行优化。

索引

由本 规范定义的术语

由 引用定义的术语

参考文献

规范性参考文献

[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[GENERIC-SENSOR]
Rick Waldron. Generic Sensor API. URL: https://w3c.github.io/sensors/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. Permissions. URL: https://w3c.github.io/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. URL: https://w3c.github.io/webappsec-permissions-policy/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

非规范性参考文献

[ALSPRIVACYANALYSIS]
Lukasz Olejnik. Privacy analysis of Ambient Light Sensors. 31 August 2016. URL: https://blog.lukaszolejnik.com/privacy-of-ambient-light-sensors/
[CSSOM-VIEW-1]
Simon Fraser; Emilio Cobos Álvarez. CSSOM View Module. URL: https://drafts.csswg.org/cssom-view/
[IMAGINGPRIVACY]
Yang Liu; et al. Imaging privacy threats from an ambient light sensor. 10 January 2024. URL: https://www.science.org/doi/10.1126/sciadv.adj3608
[MEDIAQUERIES-5]
Tab Atkins Jr.; et al. Media Queries Level 5. URL: https://drafts.csswg.org/mediaqueries-5/
[PINSKIMMINGVIASENSOR]
Raphael Spreitzer. PIN Skimming: Exploiting the Ambient-Light Sensor in Mobile Devices. 15 May 2014. URL: https://arxiv.org/abs/1405.3760
[SI]
SI Brochure: The International System of Units (SI), 8th edition. 2014. 8th Edition. URL: http://www.bipm.org/en/publications/si-brochure/
[STEALINGSENSITIVEDATA]
Lukasz Olejnik. Stealing sensitive browser data with the W3C Ambient Light Sensor API. 19 April 2017. URL: https://blog.lukaszolejnik.com/stealing-sensitive-browser-data-with-the-w3c-ambient-light-sensor-api/
[VIDEORECOGNITIONAMBIENTLIGHT]
Raphael Spreitzer. Video recognition using ambient light sensors. 21 April 2016. URL: https://doi.org/10.1109/PERCOM.2016.7456511

IDL 索引

[SecureContext, Exposed=Window]
interface AmbientLightSensor : Sensor {
  constructor(optional SensorOptions sensorOptions = {});
  readonly attribute double? illuminance;
};