环境光传感器

W3C 工作草案,

关于本文档的更多详情
当前版本:
https://www.w3.org/TR/2025/WD-ambient-light-20250212/
最新发布版本:
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 Kostiainen (英特尔公司)
Rijubrata Bhaumik (英特尔公司)
前编辑者:
Tobie Langel (Codespeaks,曾代表英特尔公司)
Doug Turner (Mozilla公司)
问题跟踪:
第2级问题

摘要

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

本文档状态

本节描述了本文档在发布时的状态。当前 W3C 发布的文档列表及本技术报告的最新修订版可在 W3C 技术报告索引 https://www.w3.org/TR/ 中找到。

本文档由设备与传感器工作组作为工作草案发布,采用推荐轨道。本文档旨在成为 W3C 推荐标准。

如果您希望对本文档提出意见,请发送至 public-device-apis@w3.org (订阅, 存档)。发送邮件时,请在主题中包含“ambient-light”,最好像这样:“[ambient-light] …评论摘要…”。欢迎所有意见。

作为工作草案发布并不意味着 W3C及其成员的认可。本文档是草稿,可能随时更新、替换或被其他文档废弃。将本文档作为除工作进展外的引用是不合适的。

本文档由在W3C 专利政策下运作的工作组制作。W3C 维护了与工作组交付物相关的任何专利披露的公开列表;该页面还包括披露专利的说明。个人如果实际了解某项专利,并认为该专利包含必要声明,必须根据W3C 专利政策第6节披露信息。

本文档受2023年11月3日 W3C 流程文档管辖。

设备与传感器工作组正在为本规范进行现代安全和隐私审查,以考虑自2017年10月3日横向审查以来,本规范及隐私和安全审查实践的变化。同样,工作组正在更新本规范的技术架构组审查,以适应最新的架构审查实践。

1. 简介

环境光传感器扩展了通用传感器 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. 安全与隐私注意事项

这里有一个追踪向量。 环境光传感器提供有关设备环境光照条件的信息。潜在的隐私风险包括:

[ALSPRIVACYANALYSIS][PINSKIMMINGVIASENSOR][STEALINGSENSITIVEDATA][VIDEORECOGNITIONAMBIENTLIGHT][IMAGINGPRIVACY] 等作品进一步探讨了这些问题。

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

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

3.1. 降低传感器读数精度

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

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

注意: 选择照度舍入倍数需要在不暴露过于精确的读数与为 API 用户提供仍然有用的读数之间取得平衡。50 勒克斯作为照度舍入倍数的最低值是在GitHub 问题 #13中确定的,此前在不同光照条件下收集了不同的环境光水平测量值(表格链接),并证明可以阻止[STEALINGSENSITIVEDATA]中描述的攻击。此外,50 勒克斯也高于使用环境光传感器读数进行视频识别所需的 5 勒克斯([VIDEORECOGNITIONAMBIENTLIGHT])。

注意: 照度阈值用于防止泄露读数围绕某个特定值但被量化为不同值的事实。例如,如果照度舍入倍数为 50,这可以防止原始读数在 24 和 26 之间切换时,照度值在 0 和 50 之间切换。阈值检查算法作为辅助指纹缓解策略的有效性尚未得到数学证明,但基于实现经验已被添加到本规范中。更多信息请参见Chromium 问题 1332536Chromium 审查 3666917

4. 模型

环境光传感器传感器类型的关联传感器子类是AmbientLightSensor类。

环境光传感器有一个默认传感器,即设备的主要光检测器。

环境光传感器是一个强大功能,其标识由名称 "ambient-light-sensor" 提供,同时也是其关联的传感器权限名称。其权限撤销算法是调用通用传感器权限撤销算法并传入 "ambient-light-sensor" 的结果。

环境光传感器是一个由字符串 "ambient-light-sensor" 标识的策略控制功能。其默认允许列表'self'

环境光传感器有一个虚拟传感器类型,即 "ambient-light"。

当前光照水平照度是一个表示设备周围环境光水平的值。其单位为勒克斯(lx)[SI]

注意: 不同设备在相同光线下报告的精确勒克斯值可能不同,这取决于检测方法、传感器结构等差异。

环境光传感器有一个以勒克斯为单位的照度舍入倍数,表示照度读数将舍入到的倍数。

环境光传感器有一个以勒克斯为单位的照度阈值,用于环境光阈值检查算法

注意: 请参阅§ 3.1 降低传感器读数精度以了解上述值的最低要求。

5. API

5.1. 环境光传感器接口

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

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

5.1.1. 照度属性

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. 环境光阈值检查算法

环境光传感器传感器类型定义了以下阈值检查算法

输入

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. 环境光读数量化算法

环境光传感器传感器类型定义了以下读数量化算法

输入

reading,一个传感器读数

输出

一个传感器读数

  1. quantizedReadingreading

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

  3. 返回quantizedReading

7. 自动化

本节通过提供环境光传感器特定的虚拟传感器元数据扩展了通用传感器 API § 9 自动化

照度读数解析算法,给定一个 JSON 对象 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 并中止这些步骤”) 应按照引入算法时使用的关键字 (“必须”、“应该”、“可以”等) 的含义进行解释。

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

索引

本规范定义的术语

引用规范定义的术语

参考文献

规范性引用

[ECMASCRIPT]
ECMAScript 语言规范。URL: https://tc39.es/ecma262/multipage/
[GENERIC-SENSOR]
Rick Waldron. 通用传感器 API。URL: https://w3c.github.io/sensors/
[INFRA]
Anne van Kesteren; Domenic Denicola. 基础标准。Living Standard。URL: https://infra.spec.whatwg.org/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. 权限。URL: https://w3c.github.io/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland. 权限策略。URL: https://w3c.github.io/webappsec-permissions-policy/
[RFC2119]
S. Bradner. RFC 中用于指示要求级别的关键字。1997 年 3 月。最佳当前实践。URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 标准。Living Standard。URL: https://webidl.spec.whatwg.org/

参考性引用

[ALSPRIVACYANALYSIS]
Lukasz Olejnik. 环境光传感器的隐私分析。2016 年 8 月 31 日。URL: https://blog.lukaszolejnik.com/privacy-of-ambient-light-sensors/
[CSSOM-VIEW-1]
Simon Pieters. CSSOM 视图模块。URL: https://drafts.csswg.org/cssom-view/
[IMAGINGPRIVACY]
Yang Liu; et al. 环境光传感器的成像隐私威胁。2024 年 1 月 10 日。URL: https://www.science.org/doi/10.1126/sciadv.adj3608
[MEDIAQUERIES-5]
Dean Jackson; et al. 媒体查询第 5 级。URL: https://drafts.csswg.org/mediaqueries-5/
[PINSKIMMINGVIASENSOR]
Raphael Spreitzer. PIN 窃取:利用移动设备中的环境光传感器。2014 年 5 月 15 日。URL: https://arxiv.org/abs/1405.3760
[SI]
SI 手册:国际单位制 (SI),第 8 版。2014 年。第 8 版。URL: http://www.bipm.org/en/publications/si-brochure/
[STEALINGSENSITIVEDATA]
Lukasz Olejnik. 使用 W3C 环境光传感器 API 窃取敏感浏览器数据。2017 年 4 月 19 日。URL: https://blog.lukaszolejnik.com/stealing-sensitive-browser-data-with-the-w3c-ambient-light-sensor-api/
[VIDEORECOGNITIONAMBIENTLIGHT]
Raphael Spreitzer. 使用环境光传感器进行视频识别。2016 年 4 月 21 日。URL: https://doi.org/10.1109/PERCOM.2016.7456511

IDL 索引

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