環境光センサー

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 Kostiainen (Intel Corporation)
Rijubrata Bhaumik (Intel Corporation)
元編集者:
Tobie Langel (Codespeaks、以前は Intel Corporation の代理)
Doug Turner (Mozilla Corporation)
課題追跡:
Level 2 の課題

概要

この仕様は、デバイスの環境の環境光レベルまたは照度を監視するための具体的なセンサーインターフェイスを定義する。

この文書のステータス

この節は、公開時点におけるこの文書のステータスを説明する。 現在の W3C 公開文書およびこの技術報告の最新改訂版の一覧は、 W3C 技術報告 インデックスで見つけることができる。

この文書は、 Devices and Sensors Working Group により、 Recommendation track を用いた作業草案として公開された。この文書は W3C 勧告となることを意図している。

この文書についてコメントしたい場合は、 public-device-apis@w3.org (購読, アーカイブ) へ送信すること。 メールを送信する際は、 件名に “ambient-light” というテキストを含め、 できれば次のようにすること: “[ambient-light] …コメントの要約…”。 すべてのコメントを歓迎する。

作業草案としての公開は、 W3C およびそのメンバーによる承認を意味しない。この文書は草案であり、 いつでも他の文書により更新、置換、または 廃止される可能性がある。この文書を進行中の作業以外のものとして引用することは不適切である。

この文書は、 W3C Patent Policy の下で運営されるグループにより作成された。 W3C は、グループの成果物に関連して行われた 特許開示の公開リスト を管理しており、 そのページには特許を開示するための指示も含まれている。 自身が Essential Claim(s) を含むと信じる特許について実際の知識を持つ個人は、Essential Claim(s) に関する情報を、W3C Patent Policy の第 6 節に従って開示しなければならない。

この文書は、2025年8月18日 W3C Process Document に従う。

この仕様は、いかなるブラウザーエンジンにおいても既定では利用できない。 現在の形式では W3C 勧告へ進むことは見込まれていない。

Devices and Sensors Working Group は、この仕様およびプライバシーとセキュリティのレビュー慣行の双方に 大きな変化があったことを考慮し、この仕様に対する最新のセキュリティおよびプライバシー レビューを進めている。これは、水平レビューが 2017年10月3日に行われた 以降の変化を踏まえたものである。同様に、このグループは、この仕様について、 最新のアーキテクチャレビュー慣行を考慮するために Technical Architecture Group レビューの更新を進めている。

1. 序論

Ambient Light Sensor は Generic Sensor API [GENERIC-SENSOR] を拡張し、デバイスの主たる光検出器により検出される環境光レベルについて、 ルクス単位で情報を提供する。

1.1. 範囲

この文書は、細粒度の照度データを低レイテンシーで、場合によっては 高頻度でサンプリングして必要とするユースケース のために設計された API を規定する。

コントラストレベルまたは優先カラースキームに従ってウェブページをスタイル付けするなど、 少数の照度値に依存する一般的なユースケースは、 デバイスにより測定された環境光レベルの影響を受ける可能性があるが、 prefers-contrast および prefers-color-scheme CSS メディア機能 [MEDIAQUERIES-5] ならびに付随する matchMedia API [CSSOM-VIEW-1] によって 最もよく対応され、この API の範囲外である。

注: [MEDIAQUERIES-5] 仕様には、かつて 環境光読み取り値により直接的に結び付けられた light-level メディア機能が含まれていた。それはその後、より高水準の prefers-color-scheme および prefers-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. セキュリティおよびプライバシーの考慮事項

There is a tracking vector here. Ambient Light Sensor は、デバイス環境付近の照明条件に関する情報を提供する。 潜在的なプライバシーリスクには次が含まれる:

[ALSPRIVACYANALYSIS][PINSKIMMINGVIASENSOR][STEALINGSENSITIVEDATA][VIDEORECOGNITIONAMBIENTLIGHT]、および [IMAGINGPRIVACY] などの著作は、 これらの問題をさらに掘り下げている。

Ambient Light Sensor に固有のこれらの脅威を軽減するため、ユーザーエージェントは センサー読み取り値の精度を低減しなければならない。ユーザーエージェントは 最大サンプリング周波数を制限してもよい。

これらの軽減戦略は、Generic Sensor API [GENERIC-SENSOR] で定義される 一般的な 軽減策 を補完する。

3.1. センサー読み取り値の精度を低減する

センサー読み取り値の精度を低減するため、この仕様は しきい値チェックアルゴリズム (環境光しきい値チェックアルゴリズム) および 読み取り値量子化アルゴリズム (環境光読み取り値量子化 アルゴリズム) を定義する。

これらのアルゴリズムは、照度丸め倍数および 照度しきい値を使用する。実装は、 それらの値について以下の要件に従わなければならない:

注: 照度丸め 倍数を選択するには、過度に精密な読み取り値を公開しないことと、API 利用者にとって なお有用な読み取り値を提供することとの均衡を取る必要がある。 照度丸め倍数の最小値としての 50 lux という値は、 異なる照明条件下での異なる環境光レベル測定値が収集 され、[STEALINGSENSITIVEDATA] で説明された攻撃を阻止することが示された後、 GitHub issue #13 で決定された。50 lux はまた、環境光センサー読み取り値を用いた 動画認識 ([VIDEORECOGNITIONAMBIENTLIGHT]) を実行不可能にするために必要な 5 lux よりも高い。

注: 照度しきい値は、 読み取り値が特定の値の周辺を行き来しているが、異なる値に量子化されるという事実を漏えいしないようにするために 使用される。たとえば、照度丸め倍数が 50 の場合、 生の読み取り値が 24 と 26 の間で切り替わっても、照度値が 0 と 50 の間で切り替わることを防ぐ。 補助的なフィンガープリンティング軽減戦略としての しきい値チェックアルゴリズムの有効性は 数学的には証明されていないが、実装経験に基づいてこの仕様に追加された。 Chromium bug 1332536 および Chromium 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" である。

現在の光 レベルまたは 照度 は、ホストデバイスの周囲の環境光レベルを表す値である。 その単位はルクス (lx) [SI] である。

注: 同じ光の下で異なるデバイスにより報告される 正確なルクス値は、検出方法、センサー構造などの違いにより、 異なることがある。

Ambient Light Sensor は、ルクスで測定される 照度丸め 倍数を持つ。これは、照度読み取り値が丸められる先の 倍数となる数を表す。

Ambient Light Sensor は、ルクスで測定される 照度しきい値を持ち、 これは環境光しきい値チェックアルゴリズムで使用される。

注: 上述の値の最小要件については、§ 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. this と "illuminance" を引数として、最新の読み取り値から値を取得するを呼び出した結果を illuminance とする。

  2. illuminance を返す。

6. 抽象操作

6.1. 環境光センサーオブジェクトを構築する

入力

optionsSensorOptions オブジェクト。

出力

AmbientLightSensor オブジェクト。

  1. AmbientLightSensor を用いて センサーポリシー制御機能をチェックする を呼び出した結果を allowed とする。

  2. allowed が false なら、次を実行する:

    1. SecurityError DOMException投げる

  3. 新しい AmbientLightSensor オブジェクトを ambient_light_sensor とする。

  4. ambient_light_sensor および options を用いて センサーオブジェクトを初期化するを呼び出す。

  5. ambient_light_sensor を返す。

6.2. 環境 光しきい値チェックアルゴリズム

Ambient Light Sensor センサー型は、次のしきい値チェックアルゴリズムを定義する:

入力

newReadingセンサー 読み取り値

latestReadingセンサー 読み取り値

出力

読み取り値の差が十分に重要であるかを示す 真偽値

  1. newReading["illuminance"] が null なら、true を返す。

  2. latestReading["illuminance"] が null なら、true を返す。

  3. newReading["illuminance"] を newIlluminance とする。

  4. latestReading["illuminance"] を latestIlluminance とする。

  5. abs(latestIlluminance - newIlluminance) が 照度しきい値未満なら、false を返す。

  6. newIlluminance を用いて 環境光読み取り値 量子化アルゴリズムアルゴリズムを呼び出した結果を roundedNewReading とする。

  7. latestIlluminance を用いて 環境光読み取り値 量子化アルゴリズムアルゴリズムを呼び出した結果を roundedLatestReading とする。

  8. roundedNewReading["illuminance"] と roundedLatestIlluminance["illuminance"] が等しいなら、false を返す。

  9. そうでなければ、true を返す。

注: このアルゴリズムは、 環境光読み取り値量子化 アルゴリズムを呼び出し、同じ値に丸められる読み取り値が、主たる 最新の 読み取り値を更新するアルゴリズムで更新を 引き起こさないようにする。そうしない場合、ユーザーに対し、生の照度読み取り値が、 少なくとも照度しきい値だけ異なるが、 異なる照度丸め倍数へは丸められない範囲内にあることを示すことになる。

6.3. 環境光読み取り値量子化アルゴリズム

Ambient Light Sensor センサー型は、次の読み取り値量子化アルゴリズムを定義する:

入力

readingセンサー 読み取り値

出力

センサー読み取り値

  1. readingquantizedReading とする。

  2. quantizedReading["illuminance"] を、reading["illuminance"] が最も近い 照度丸め倍数の倍数に設定する。

  3. quantizedReading を返す。

7. 自動化

この節は、Generic Sensor API § 9 Automation を拡張し、Ambient Light Sensor 固有の仮想センサーメタデータを提供する。

JSON Object parameters が与えられた場合、照度読み取り値解析アルゴリズムは、 parameters および "illuminance" を用いて 単一値数値読み取り値を解析するを呼び出した結果を 返さなければならない。

型ごとの仮想センサーメタデータ マップ は、次のエントリを持たなければならない:

キー

"ambient-light"

仮想センサーメタデータであって、その 読み取り値解析アルゴリズム照度読み取り値解析アルゴリズム であるもの。

8. ユースケースおよび要件

一部のユースケースは精密な環境光測定値を取得することから恩恵を受ける可能性がある一方、 環境光レベルの変動をユーザー入力イベントへ変換するユースケースは、より高い サンプリング周波数から恩恵を受ける。

9. 謝辞

初期プロトタイプについて Doug Turner に、 テストスイートについて Marcos Caceres に感謝する。

LightLevelSensor のアイデアについて Paul Bakaus に感謝する。

ユースケースおよび要件について Mikhail Pozdnyakov と Alexander Shalamov に感謝する。

プライバシーリスク評価について Lukasz Olejnik に感謝する。

適合性

文書 規約

適合性要件は、記述的な表明と RFC 2119 用語の組み合わせで 表現される。 この文書の規範部分におけるキーワード “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” は、RFC 2119 で説明されるように解釈されるものとする。 ただし、読みやすさのため、 この仕様ではこれらの語はすべて大文字では現れない。

この仕様のすべてのテキストは、 非規範として明示的に示された節、例、および注を除き、規範的である。 [RFC2119]

この仕様における例は、“for example” という語で導入されるか、 次のように class="example" によって 規範テキストから区別される:

これは参考例の例である。

参考注記は “Note” という語で始まり、 次のように class="note" によって 規範テキストから区別される:

注、これは参考注記である。

適合 アルゴリズム

アルゴリズムの一部として命令形で表現された要件 (たとえば "strip any leading space characters" または "return false and abort these steps") は、そのアルゴリズムを導入する際に使用されたキーワード ("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;
};