構築の様子を見る
フィルム / SDK でキオスクアプリを構築
3:07

Claude Code はwindow.screenrigに対するロビー受付キオスクを書き込みます:waitUntilActive()、ready()、kv.get()、emitConfirmed()。訪問者のタップはエージェントに届き、ウェルカムウォールで応答します。チャプターと書き起こし →
ランタイムはすでにアプリ内にあります。
app pack と app upload は、ルート index.html を持つビルド済みの静的ディレクトリを受け取ります。パッカーは _screenrig/runtime.js を挿入し、そのスクリプトタグをドキュメントに追加します。実行中のアプリケーションはビルドや npm 依存なしで window.screenrig を受け取ります。インストール・インポート・設定は不要です。
各イミュータブルアプリケーションリリースはapps.screenrig.ai配下の独自の分離オリジンで動作します。アプリケーションIDはリリースより長く存続するため、1つのリリースで書き込まれたキー/値データは次のリリースでも利用できます。
window.screenrigサーフェス
3つの読み取り専用プロパティ、10個のメソッド、さらに5つのメソッドを持つ名前空間 kv、そしてディスプレイ、人の存在、ハードウェアキー、光センサー、ネットワーク状態、触覚フィードバック用の名前空間 device があります。まず readyState を読み、アクティベーションによっては存在しないメソッドを呼び出す前に capabilities を確認してください。
各メソッドは異なる質問に答えますので、やりたいことから始めてください。
| これを行うには | 通話 |
|---|---|
| Playerがこのページをアクティブにするまで待ちます。 | screenrig.waitUntilActive() |
| アプリケーションが起動してスクリーンに表示されていると伝えます。 | screenrig.ready() |
| アプリケーション進行ページでこのアプリのターンを終了する | screenrig.nextPage() |
| このページに今は表示するものがないことをPlayerに伝える | screenrig.skip(reason) |
| エージェントに何かが起きたことを伝える | screenrig.emit(code) |
| バックエンドがそのイベントを記録したことを知る | screenrig.emitConfirmed(code) |
| Playerとランタイムが収集する診断を残す | screenrig.log(...) |
| ライブアプリケーション状態を読み取ります | screenrig.kv.get(), screenrig.kv.list() |
| ライブアプリケーション状態を書く | screenrig.kv.set(), screenrig.kv.delete() |
| ライブアプリケーション状態の変化時に更新 | screenrig.kv.onChange() |
| サイズや機能の変更に対応 | screenrig.onResize(), screenrig.onCapabilities() |
| ディスプレイの明るさを下げる、暗くする、または復帰させる | screenrig.device.display.set() |
| 誰かが画面に近づいたことを検知する | screenrig.device.onPresence() |
| ハードウェアのボリュームキーを受け取る | screenrig.device.onKey() |
| 周囲の明るさのレベルを検知する | screenrig.device.onLight() |
| デバイスがオンラインまたはオフラインになったことを検知する | screenrig.device.onNetwork() |
| 触覚ティックを再生する | screenrig.device.vibrate() |
| アプリケーションがランタイムを終了したときにリスナーを解除する | screenrig.destroy() |
screenrig.readyState#
注入されたランタイムが接続されているか。すべてのドキュメントはinertで開始し、Playerのハンドシェイクとコンテキストが到着するとactiveに変わります。まだ画面上にないページはinertのままです。activeをscreenrig.waitUntilActive()で待ちます。読み込み時のinertは「screenRIG外」と見なさないでください。failedまたはwindow.screenrigがない場合は独自コンテンツをレンダリングし、下のサーフェスをスキップします。同じビルドがscreenRIG外でも動作します。inert、ready()、log()、emit()、emitConfirmed()、nextPage()、skip()およびkvの読み書きはコードinertで例外または拒否されます。kv.onChangeはいつでも登録可能です。
screenrig.context#
このドキュメントが実行されている場所。
| フィールド | タイプ | メモ |
|---|---|---|
application_id | string | app uploadからのapp_ID。キー/バリューストアはこれに属します。 |
release_id | string | このオリジンにサービスする不変リリース。 |
primitive_id | string | このドキュメントが現在のページで埋めるプリミティブです。 |
viewport | { width, height } | Player がレンダリングするサーフェス。 |
primitive | { width, height } | そのビューポート内でこのドキュメントが占める矩形。 |
capabilities | object | screenrig.capabilities と同じブール値。 |
screen_id | 文字列、オプション | ランタイムがどのスクリーンが再生中かを知っている場合に存在します。 |
context は説明用であり、リクエスト用の情報ではありません。内容は署名や転送、screenRIG への返信を意図していません。必要な情報は下記のメソッドでランタイムに渡されます。
起動パラメーターは context には含まれません。プレイリストはアプリケーションに params(iframe アドレスとアプリケーションの params のスクリーントークンを参照)を与えることができ、Player は各パラメーターを ticket の後ろに、ページのアドレスのクエリパラメーターとして付加します。location.search から読み取ってください。例: new URLSearchParams(location.search).get("kiosk")。これらはヒントであって認証情報ではなく、ページを開ける人は任意の値を送れるため、信頼できない入力として扱ってください。どのスクリーンが再生中かは context.screen_id で知ります。Qt、Android、Apple、Windows の Player はローカルパッケージからアプリケーションを読み込み、そこには起動アドレスがなく、パラメーターも渡されません。
screenrig.capabilities#
このアクティベーションで有効なメソッドが何かを示す10個のブール値です。キーはドット区切りなのでブラケット表記で読み取ってください。
| フラグ | ゲート |
|---|---|
page.advance | screenrig.nextPage() |
page.skip | screenrig.skip() |
kv.read | screenrig.kv.get()、screenrig.kv.list()、およびscreenrig.kv.onChange() |
kv.write | screenrig.kv.set() と screenrig.kv.delete() |
device.display | screenrig.device.display.get()、.set()、およびscreenrig.device.onDisplay() |
device.presence | screenrig.device.onPresence() |
device.keys | screenrig.device.onKey() |
device.light | screenrig.device.onLight() |
device.network | screenrig.device.onNetwork() |
device.haptics | screenrig.device.vibrate() |
if (window.screenrig.capabilities["kv.write"]) {
saveButton.hidden = false;
}起動時にフラグを一度読む代わりに、onCapabilitiesで購読してください。
screenrig.waitUntilActive(timeoutMs)#
最初に呼び出し、他のメソッドの前に UI をレンダリングしながら待機します。 プレーヤーがこのページをアクティブにすると解決されます。すでにランタイムが active の場合は即時解決し、アプリのレンダリング完了は宣言しません。timeoutMs(デフォルト 10000、最大 300000)後に activation_timeout で拒否されます。順番待ちのページは再度待機可能です。音声は解決後に開始してください。Player はページが表示される前にアプリケーションを読み込むためです。ブラウザが自動再生を許可する画面ではすぐに開始され、拒否する画面では play() が NotAllowedError で拒否されるので、エラーを捕捉してミュートで再生してください。
const sr = window.screenrig;
async function start() {
render(); // the UI works with or without screenRIG
if (!sr) return;
for (;;) {
try { await sr.waitUntilActive(60000); break; }
catch (err) { if (err.code !== "activation_timeout") return; }
}
await sr.ready();
// From here: emit, emitConfirmed, log, kv, nextPage.
}
start();イベントハンドラー、タイマー、catchからSDK呼び出しの前にreadyState === "active"をチェックし、早く到着した入力をキューに入れます。inert中に実行されるハンドラーからのlog()は例外を投げ、起動前にイベント送信を終了させることがあります。
screenrig.ready()#
waitUntilActive() 解決後、context、kv、nextPage に依存する前に呼び出します。アプリが画面に必要なものを持った時点で呼び出されます。inert の間に呼び出すと例外を投げます。
await window.screenrig.waitUntilActive();
await window.screenrig.ready();screenrig.nextPage()#
このプリミティブがコントローラーのアプリ進行ページでのみ呼び出します。アプリがターンを終えた時に呼び出します。一度きりで、アクティベーションは一回の進行を得ます。
window.screenrig.nextPage();このメソッドはadvance.modeがapplicationのページ用で、このプリミティブがコントローラーです:
{
"advance": { "mode": "application", "max_ms": 60000 },
"primitives": [
{
"id": "app",
"primitive": "application",
"release_id": "rel_01EXAMPLERELEASE000000000",
"rect": { "x": 0, "y": 0, "width": 1920, "height": 1080 },
"layer": 0,
"content_fit": "fill",
"controller": true
}
]
}そのページの正確に1つのプリミティブが controller: true を持ち、かつそれはアプリケーションプリミティブでなければなりません。ページの max_ms はターンの境界を示します。
screenrig.skip(reason)#
アプリケーションが今は表示するものがないときは、ready()の代わりに呼び出します。画面はページの通常のトランジションですぐに次へ進み、この表示は再生として数えられません。開始時の判断です。アクティベーションから10秒以内、ready()より前に呼び出してください。
await window.screenrig.waitUntilActive();
const events = await loadToday();
if (events.length === 0) {
await window.screenrig.skip("no events today");
} else {
render(events);
await window.screenrig.ready();
}ページのコントローラー、またはページ上で唯一のアプリケーションがこの権限を持ちます。画像や動画のないページが対象です。権限がないとcapability_denied、ready()の呼び出し後はskip_after_ready、この機能を持たないPlayerではnot_supportedで拒否されます。Playerがページを保持する場合(オペレーターが保持している、ディスプレイが消灯している、再生できる他のページがない、または他のすべてのページもスキップ済み)はforbiddenで拒否されます。その場合は代替表示を描画し、ready()を呼び出してください。すべてがスキップするタイルのプレイリストは、巡回せず最後の1つを全時間表示します。任意のreason(最大64文字)は、プロジェクトのPlayerログにplayer.application_skippedとして記録されます。skip()はapp packとapp uploadが注入するランタイムに含まれるため、リリースを再パックしてメソッドを追加してください。
screenrig.emit(code)#
エージェントが何かが起きたことを知る必要があるときに使う:ページがステップを完了した、キオスクフォームが送信された、アプリが実行を証明した。これは名前付きアプリケーションイベントで、プロジェクトのイベントログに記録され、バンドルされたCLIの events list または events follow でエージェントが監視します。コードのみでメッセージ本文なし。
logは代替ではありません。診断はアプリケーションイベントではなく、イベントログを読むエージェントはそれを見ません。
window.screenrig.emit("menu.rendered");SDKのemit()とemitConfirmed()は、スクリーンをリソースとするapplication.eventレコードを追加します。--type application.eventで読み取り、必要に応じて--screen-idを追加します。返されるdetails.primitive_idとdetails.codeは、送信元のプリミティブと名前付きアクションを識別します。--app-idはアプリケーションリソース、リリース、K/Vのイベントを選択するため、これらのスクリーンイベントは含みません。
screenrig events list --type application.event --screen-id scr_SCREEN| パラメーター | タイプ | メモ |
|---|---|---|
code | string | 最大64文字で[A-Za-z0-9._-]にサニタイズ。 |
screenrig.emitConfirmed(code)#
アプリケーションがイベントの受信を確認する必要があるときに使う:キオスク注文が行われた、フォームが送信された、訪問が終了した。emit と同じ名前付きアプリケーションイベントを送信し、Playerがバックエンドの受理を確認してから約束が解決されます。
イベントが拒否された場合はバックエンドの問題で拒否し、10秒間応答がなければack_timeoutで拒否します。タイムアウト後の自動再試行はしないでください:バックエンドはすでにイベントを受け入れている可能性があります。レシートはイベントがプロジェクトイベントログにあることを証明し、何かがそれに作用したことを示すものではありません。
レシートはアプリケーションを実行するすべてのプレーヤーで機能します。
await window.screenrig.emitConfirmed("order.placed");| パラメーター | タイプ | メモ |
|---|---|---|
code | string | 最大64文字で[A-Za-z0-9._-]にサニタイズ。 |
screenrig.log({ level, code, message })#
診断に使う:debug、info、warn、error は、アプリがスクリーン上にある間にPlayerとランタイムが収集するテキストです。注入されたランタイムログもこの方法で記録されます。ログは制限あり:クライアントごとに32行、各メッセージは最大2048バイト。デバッグ時に必要な内容を記録し、フレームごとに1行は避けてください。
emit を意味するときに log に手を伸ばさないでください。エージェントはログ行をアプリケーションイベントとして扱わないため、エージェントが処理すべきものはすべて emit コード内に入ります。
window.screenrig.log({
level: "warn",
code: "menu.stale",
message: "Falling back to the cached menu."
});| フィールド | タイプ | メモ |
|---|---|---|
level | string | debug、info、warn、またはerror。 |
code | string | 最大64文字で[A-Za-z0-9._-]にサニタイズ。 |
message | string | 最大2048バイト。 |
screenrig.onResize(handler)#
レイアウトが変わる場合に購読してください。一度だけcontextを読む代わりに。ハンドラーは{ viewport, primitive }を受け取り、contextが持つ同じ2つのオブジェクトを受け取ります。呼び出しは購読を終了する関数を返します。
const stopResize = window.screenrig.onResize(function (size) {
render(size.viewport, size.primitive);
});
stopResize();screenrig.onCapabilities(handler)#
付与された機能が変わる場合に購読してください。起動時に一度決める代わりに。現在の真偽値はハンドラー内のscreenrig.capabilitiesで読み、影響を受けるコントロールを有効化または非表示にします。呼び出しは購読を終了する関数を返します。
const stopCapabilities = window.screenrig.onCapabilities(function () {
saveButton.hidden = !window.screenrig.capabilities["kv.write"];
});screenrig.destroy()#
アプリケーションがランタイムを使い終わったらリスナーを解除します。アプリケーションが全ターン実行し、Player がドキュメントを置き換える場合は呼び出す必要はありません。
screenrig.kv#
アプリケーションのキー/バリューストアは、1回の起動を超えて持続するライブアプリケーション状態用です。5つの独自メソッド:get、list、set、delete、onChange。以下の キー/バリューストア を参照してください。
キー/値ストア。
ライブアプリケーション状態にはストアを使用します:アプリがレンダリングするメニュー、オペレーターが今朝変更したコピー、最後の起動で残されたカウンター。kv.getとkv.listで読み取り、kv.setとkv.deleteで書き込み、kv.onChangeですべての変更を通知します。
ストアは context.application_id のアプリケーション ID に属し、リリースには属しません。そのため、エントリは次の app upload をまたいで存続します。値はバイト単位で、テキスト、JSON、小さなバイナリはすべて往復可能です。読み取りには kv.read、書き込みには kv.write が必要です。呼び出す前にフラグを確認してください。
ストアとその変更プッシュは、Player Web アプリ(PWA)、Android、Amazon Signage Stick、macOS、Windows、Linux、Raspberry Pi、LG webOS Signage、BrightSign、Samsung Smart Signage(Tizen)で動作するすべての Player で実行されます。Apple TV、iPhone、iPad はアプリを実行しません。プラットフォーム別プリミティブサポートを参照してください。
screenrig.kv.get(key)#
ライブアプリケーションの状態を読む。 プロミスを待ちます。
const entry = await window.screenrig.kv.get("menu");screenrig.kv.list()#
まだキーがわからないときにライブアプリケーションの状態を読む:これはアプリケーションが保存しているキーの一覧です。プロミスを待ちます。
const keys = await window.screenrig.kv.list();screenrig.kv.set(key, value, options)#
ライブアプリケーション状態を書き込む。 value は文字列か Uint8Array。options は任意です。
await window.screenrig.kv.set("menu", JSON.stringify(menu), {
contentType: "application/json"
});
await window.screenrig.kv.set("badge.png", pngBytes, {
contentType: "image/png"
});| パラメーター | タイプ | 必須 | メモ |
|---|---|---|---|
key | string | はい | キーを参照。 |
value | 文字列 または Uint8Array | はい | 保存するバイト。 |
options.contentType | string | いいえ | 文字列にはtext/plain、Uint8Arrayにはapplication/octet-streamがデフォルトです。 |
options.expectedRevision | 0以上の整数 | いいえ | エントリがまだこのリビジョンの場合のみ書き込みます。 |
options.idempotencyKey | string | いいえ | 同じ書き込みを重複適用せずに再試行します。 |
screenrig.kv.delete(key, expectedRevision, options)#
ライブアプリケーション状態を書き込むにはエントリを削除します。expectedRevision は任意です:省略すると現在のエントリを削除し、指定すると同時変更を拒否します。
await window.screenrig.kv.delete("menu");| パラメーター | タイプ | 必須 | メモ |
|---|---|---|---|
key | string | はい | キーを参照。 |
expectedRevision | 0以上の整数 | いいえ | 読み取った時点の改訂。 |
options.idempotencyKey | string | いいえ | 同じ削除を重複適用せずに再試行します。 |
screenrig.kv.onChange(handler)#
ライブアプリケーション状態の変更時に即時更新し、ポーリングはしません。ハンドラーはこのアプリの任意のキーが変更されるたびに実行されます。作成者は kv set のエージェント、key/value webhook 経由の外部システム、または任意のスクリーン上のこのアプリです。変更されたキーのみ受け取り、値は受け取らないため、新しい値は kv.get で読みます。呼び出しは購読終了関数を返します。
const sr = window.screenrig;
async function showMenu() {
render(await sr.kv.get("menu"));
}
const stopChanges = sr.kv.onChange(function (change) {
if (change.key === "menu" && !change.deleted) showMenu();
});
await sr.waitUntilActive();
await sr.ready();
await showMenu();最初の読み取り前に購読してください。そうしないと、読み取り中に発生した変更を見逃します。アクティベーション前に登録されたハンドラーはページがアクティブになると開始します。購読を終了するにはstopChanges()を呼び出してください。
変更は、このアプリケーションをプレイリストに配置しているすべてのスクリーンに数秒で届きます。1つのキーへの複数の素早い書き込みは、最新リビジョンを持つ1つの変更として届くことがあるため、変更は「このキーを再読込する」ものと考え、書き込み回数として扱わないでください。変更はシグナルであり履歴ではありません。アプリ起動時に必要なものを読み込み、その後は変更を追従してください。
| フィールド | タイプ | メモ |
|---|---|---|
key | string | 変更されたキー。 |
revision | 整数(任意) | エントリーの新しいリビジョン。deletedがtrueの場合は存在しません。 |
deleted | boolean | true はキーが削除されたとき。 |
キー一覧
キーは1~256バイトのUTF-8です。制限は文字数ではなくバイト数なので、多バイト文字のキーは長さより早く制限に達します。キーは_screenrig/で始まってはいけません。そのプレフィックスは注入されたランタイムに属します。
リビジョンと冪等性
すべてのエントリにはリビジョンが付いています。オプションでexpectedRevisionからscreenrig.kv.setまたはscreenrig.kv.deleteに渡して、エントリが読み取ったリビジョンのままの場合のみ書き込みます。リビジョンが古い場合は他の誰かが先に書き込んだことを意味します:エントリを再度読み取り、変更を再適用して再試行してください。
idempotencyKey は残り半分をカバーします。応答が失われた場合に再試行される書き込みは、すべての試行で同じキーを持つことができ、ストアは一度だけ適用します。
CLI と同じストア。
エージェントはバンドルされた CLI の kv コマンドを使い、app upload の app_ ID に対してブラウザ外からこれらのエントリーにアクセスできます。これはオペレーターのストアビューです。上記の5つの方法の代わりではありません:アプリケーションは画面上でブラウザを通じて自身のデータを screenrig.kv で変更します。エージェントが書き込んだ変更は kv.onChange を通じて実行中のアプリケーションに届きます。
他システムからデータをプッシュ
キー/バリューWebhookはこのアプリケーションの1つのキーを書き込むURLです。POS、スプレッドシートスクリプト、cronジョブ、curlなどHTTP POSTを送信できるものに渡してください。各POSTはそのキーの値を置き換えます。実行中のすべてのスクリーンはkv.onChangeを通じて数秒以内に通知を受け、新しいリリースもエージェントも不要です。
エージェントはバンドルされた CLI でキー用のものを作成し、その URL とシークレットを渡します:
screenrig kv webhook create menu --app-id app_01EXAMPLEAPP00000000000 --description "Point of sale menu feed"回答は webhook の url とその secret (srkw_…) を含みます。シークレットは webhook 作成時とシークレット回転時のみ表示されるため、送信システムにすぐに入力してください。URL は秘密ではなく、シークレットが秘密です。
送信者は新しい値を生のリクエスト本文として投稿し、シークレットは Authorization ヘッダーに入れます。
curl https://api.screenrig.ai/api/applications/app_01EXAMPLEAPP00000000000/kv-webhooks/kvw_01EXAMPLEWEBHOOK00000/write \
-H "Authorization: Bearer $KV_WEBHOOK_SECRET" \
-H "Content-Type: application/json" \
--data '{"soup":"lentil","price":"6.50"}'HTTP Basic認証のみを使う送信者はWebhook IDをユーザー名、シークレットをパスワードとして使います:
curl https://api.screenrig.ai/api/applications/app_01EXAMPLEAPP00000000000/kv-webhooks/kvw_01EXAMPLEWEBHOOK00000/write \
--user "kvw_01EXAMPLEWEBHOOK00000:$KV_WEBHOOK_SECRET" \
-H "Content-Type: application/json" \
--data '{"soup":"lentil","price":"6.50"}'- 本文は最大1MiBで値となり、
Content-Typeはそのコンテンツタイプです(ヘッダーがなければapplication/octet-stream)。値はブラウザアプリケーションに届くため、資格情報を投稿しないでください。 - 各投稿は
kv setのようなキー/値の書き込みです。値を置き換え、リビジョンを上げ、他の書き込みと同様にストレージに計上されます。 - 回答はキーの新しいメタデータ (
key,revision,bytes,sha256,content_typeとupdated_at) であり、値は含みません。 - 投稿を安全にリトライするために
Idempotency-Keyヘッダー(8~200文字)を追加します:24時間以内に同じキーは1回だけ有効で、異なる本文やコンテンツタイプの同じキーはidempotency_mismatchで拒否されます。ヘッダーがない場合、すべての投稿は新しい書き込みです。 - 1つのWebhookは1分あたり最大120回の投稿を受け付けます。それを超えると回答は
429とRetry-Afterになります。 - 欠落または誤ったシークレット、または不明なWebhookは
401で応答します。URLやクエリ文字列のシークレットは決して受け入れられません。 - アプリケーションは最大20個の webhook を持てます。
kv webhook rotate-secretは新しいシークレットを発行し、古いものは即座に停止します。kv webhook deleteは URL を即座に停止し、キーの値はそのまま残します。
カードもWebhookを受け付けます。送信内容がそのまま、またはマッピングを通して、カードのデータドキュメントになります(カードWebhook)。
デバイス
ウォールパネルやキオスクを動かすアプリケーションは、自分が表示されている画面を操作できます。device フラグは、そのデバイスで操作できる Player 上で、ページを制御するフレーム(ページのコントローラー、またはページ上で唯一のアプリケーション)に渡されます。Android Player は device.display、device.keys、device.network を付与し、デバイスにカメラがあり、デバイスを設定した人が Player によるカメラの使用を許可している場合は device.presence を(Android の設定、アプリ、screenRIG Player、権限、カメラ)、光センサーがある場合は device.light を、バイブレーターがある場合は device.haptics を付与します。デバイスを操作できない Player では、すべての device フラグが false のままです。display.get()、display.set()、vibrate() は、これらを提供しない Player では not_supported で、フラグがない場合は capability_denied で拒否されます。onDisplay、onPresence、onKey、onLight、onNetwork はいつでも登録でき、kv.onChange と同様に、フラグがなければ実行されません。
screenrig.device.display.set(state)#
ディスプレイの明るさを下げる、暗くする、または復帰させる。brightness は 0 から 1 の値です(0 はバックライトの最低値で、消灯ではありません)。on: false は画面を暗くし、on: true は再び点灯します。省略したメンバーは現状のままです。画面が暗い間もタップはアプリケーションに届くため、タップで復帰させることができます。画面を暗いまま保持するディスプレイスケジュールはアプリケーションより優先され、ページが画面から離れると Player はディスプレイを元に戻します。
await window.screenrig.device.display.set({ brightness: 0.3 });
await window.screenrig.device.display.set({ on: false });screenrig.device.display.get()#
現在のディスプレイの状態({ on, brightness })。
screenrig.device.onDisplay(handler)#
ディスプレイが変化するたびに { on, brightness } を渡して呼び出されます。変更したのがこのアプリケーション、ディスプレイスケジュール、オペレーターのいずれでも同様です。
screenrig.device.onPresence(handler)#
デバイスが画面の前で誰かが動くのを検知したときに、最大で1秒に1回呼び出されます。Player はデバイスのカメラを読み取りますが、画像は保持しません。画像は保存、記録、送信されません。カメラはハンドラーが登録されている間だけ動作します。
window.screenrig.device.onPresence(function () {
window.screenrig.device.display.set({ on: true, brightness: 1 });
});screenrig.device.onKey(handler)#
ハードウェアのボリュームキーが押されるたび(リピートを含む)に、"volume_up" または "volume_down" を渡して呼び出されます。ハンドラーが登録されている間、キーはアプリケーションのものとなり、デバイスの音量は変わりません。
screenrig.device.onLight(handler)#
周囲の明るさをルクスで渡して呼び出されます。ハンドラーの登録後の最初の読み取り値で呼び出され、その後は光が 10% 以上、または 1 ルクスにわたって変化するたびに、最大で 1 秒に 1 回呼び出されます。デバイスには光センサーが必要です。
window.screenrig.device.onLight(function (lux) {
document.body.classList.toggle("dim-room", lux < 10);
});screenrig.device.onNetwork(handler)#
システムが検証済みのインターネット接続をデバイスが得たとき、または失ったときは常に true または false を渡して呼び出され、最初のハンドラーが登録されたときには現在の状態ですぐに呼び出されます。
window.screenrig.device.onNetwork(function (online) {
offlineBadge.hidden = online;
});screenrig.device.vibrate(ms)#
触覚ティックを 1 回再生します。 ms は 1 から 200 までのミリ秒単位の整数で、デフォルトは 12 です。Player が振動を開始すると、プロミスは値なしで解決されます。それ以外の ms では、何も送信せずに invalid_request で拒否されます。
await window.screenrig.device.vibrate();
await window.screenrig.device.vibrate(40);スクリーンのネットワーク上のデバイスにアクセスする
アプリケーションは https:// に加えて http:// と ws:// のアドレスからも取得できるため、http://192.168.1.20 にあるコントローラーなど、スクリーンと同じネットワーク上のデバイスやサーバーと通信できます。Android、Linux と Raspberry Pi、Windows、macOS の各 Player はこれを許可します。Player ウェブアプリを実行しているキオスクブラウザーでは、ブラウザーの所有者がエンタープライズポリシーで許可します。ローカルネットワーク上のアプリケーションを参照してください。呼び出すサーバーは、アプリケーションのオリジンに対して CORS で応答してください。macOS ではアプリケーションのリクエストに Origin: null が付くため、サーバーの CORS でそのオリジンを許可します。
ブラウザーエンジンは、セキュアなページ上の <img src="http://…"> をブロックします。そのため、http:// アドレスの画像は fetch() と URL.createObjectURL() で読み込んでください。
const response = await fetch("http://192.168.1.20/snapshot.jpg");
image.src = URL.createObjectURL(await response.blob());