Documentación

Cree una app que pertenezca a una pantalla

Use el SDK de navegador inyectado para control de listas de reproducción, eventos de aplicación, diagnóstico y estado persistente clave/valor.

Ver cómo se construye

Película / Crear una aplicación de kiosco con el SDK

3:07

Un visitante tocando un kiosco de registro en el vestíbulo bajo un muro de bienvenida

Claude Code escribe un kiosco de registro en el vestíbulo contra window.screenrig: waitUntilActive(), ready(), kv.get() y emitConfirmed(). El toque de un visitante llega al agente, y este responde en la pared de bienvenida. Capítulos y transcripción →

El tiempo de ejecución ya está en la aplicación

app pack y app upload toman un directorio estático ya construido con una raíz index.html. El empaquetador inyecta _screenrig/runtime.js y añade su etiqueta de script a ese documento. La aplicación en ejecución recibe window.screenrig sin paso de compilación ni dependencia npm: no hay nada que instalar, importar o configurar.

Cada versión inmutable de la aplicación se ejecuta en su propio origen aislado bajo apps.screenrig.ai. El id. de la aplicación sobrevive a la versión, por lo que los datos clave/valor escritos por una versión siguen estando disponibles para la siguiente.

La superficie window.screenrig

Tres propiedades de solo lectura, diez métodos, un espacio de nombres kv de cinco más y un espacio de nombres device para la pantalla, la presencia, las teclas físicas, el sensor de luz, el estado de la red y la respuesta háptica. Lea readyState primero y revise capabilities antes de llamar a un método que una activación dada puede no tener.

Cada método responde a una pregunta diferente, así que comience por lo que desea hacer:

Para hacer estoLlamada
Espere hasta que el Player active esta páginascreenrig.waitUntilActive()
Indica que la aplicación está activa y en pantallascreenrig.ready()
Finalizar el turno de esta aplicación en una página de avance de aplicaciónscreenrig.nextPage()
Indicar al Player que esta página no tiene nada que mostrar por ahorascreenrig.skip(reason)
Informe al agente que algo sucedióscreenrig.emit(code)
Saber que el backend registró ese eventoscreenrig.emitConfirmed(code)
Deje un diagnóstico para que el Player y el tiempo de ejecución lo recopilenscreenrig.log(...)
Lea el estado en vivo de la aplicaciónscreenrig.kv.get(), screenrig.kv.list()
Escriba estado de aplicación en vivoscreenrig.kv.set(), screenrig.kv.delete()
Actualizar en el momento en que cambia el estado de la aplicación en vivoscreenrig.kv.onChange()
Reaccione a un cambio de tamaño o capacidadscreenrig.onResize(), screenrig.onCapabilities()
Atenuar, oscurecer o activar la pantallascreenrig.device.display.set()
Enterarse de que alguien se acercó a la pantallascreenrig.device.onPresence()
Tomar el control de las teclas de volumen físicasscreenrig.device.onKey()
Enterarse del nivel de luz ambientalscreenrig.device.onLight()
Enterarse de que el dispositivo se puso en línea o se quedó sin conexiónscreenrig.device.onNetwork()
Emitir un pulso hápticoscreenrig.device.vibrate()
Desconectar los escuchas cuando la aplicación termine con el runtimescreenrig.destroy()

screenrig.readyState#

Si el runtime inyectado está adjunto. Cada documento comienza inert y cambia a active cuando llegan el apretón de manos y el contexto del Player; una página que aún no está en pantalla permanece inert. Espere active con screenrig.waitUntilActive(); no trate inert al cargar como "fuera de screenRIG". En failed, o cuando falta window.screenrig, renderice su propio contenido y omita la superficie inferior, para que la misma compilación también funcione fuera de screenRIG. Mientras inert, ready(), log(), emit(), emitConfirmed(), nextPage(), skip() y las lecturas y escrituras de kv lanzan o rechazan con código inert; kv.onChange puede registrarse en cualquier momento.

Tipo
"inert" | "active" | "failed"

screenrig.context#

Dónde se ejecuta este documento.

CampoTipoNotas
application_idstringEl id app_ de app upload. La tienda clave/valor le pertenece.
release_idstringLa versión inmutable que sirve este origen.
primitive_idstringEl primitivo que este documento llena en la página actual.
viewport{ width, height }La superficie en la que el Player está renderizando.
primitive{ width, height }El rectángulo que ocupa este documento dentro de esa ventana gráfica.
capabilitiesobjectLos mismos booleanos que screenrig.capabilities.
screen_idcadena, opcionalPresente cuando el tiempo de ejecución sabe qué pantalla está reproduciendo.

context es descripción, no material de solicitud. Nada en él está destinado a ser firmado, reenviado o enviado de vuelta a screenRIG; los métodos a continuación llevan lo que el tiempo de ejecución necesita.

Los parámetros de lanzamiento no forman parte de context: una lista de reproducción puede dar a una aplicación params (vea Tokens de pantalla en direcciones de iframe y params de aplicación), y el Player añade cada uno a la dirección de la página como parámetro de consulta después de ticket. Léalos desde location.search, por ejemplo new URLSearchParams(location.search).get("kiosk"). Son indicaciones, no credenciales, y cualquiera que pueda abrir la página puede enviar cualquier valor, así que trátelos como entrada no confiable; context.screen_id sigue siendo la forma de saber qué pantalla está reproduciendo. Los Players Qt, Android, Apple y Windows cargan una aplicación desde su paquete local, que no tiene dirección de lanzamiento, y no le pasan parámetros.

screenrig.capabilities#

Diez booleanos que indican qué métodos restringidos harán algo para esta activación. Las claves están punteadas, así que léalas con notación de corchetes.

MarcarPuertas
page.advancescreenrig.nextPage()
page.skipscreenrig.skip()
kv.readscreenrig.kv.get(), screenrig.kv.list() y screenrig.kv.onChange()
kv.writescreenrig.kv.set() y screenrig.kv.delete()
device.displayscreenrig.device.display.get(), .set() y screenrig.device.onDisplay()
device.presencescreenrig.device.onPresence()
device.keysscreenrig.device.onKey()
device.lightscreenrig.device.onLight()
device.networkscreenrig.device.onNetwork()
device.hapticsscreenrig.device.vibrate()
if (window.screenrig.capabilities["kv.write"]) {
  saveButton.hidden = false;
}

Suscríbase con onCapabilities en lugar de leer las banderas una vez al iniciar.

Tipo
objeto de booleanos

screenrig.waitUntilActive(timeoutMs)#

Llámelo primero, antes que cualquier otro método, y renderice su interfaz mientras espera. Se resuelve cuando el Player ha activado esta página, o inmediatamente si el tiempo de ejecución ya está active, y no declara la aplicación renderizada. Rechaza con activation_timeout después de timeoutMs (por defecto 10000, máximo 300000); una página que espera su turno puede simplemente esperar de nuevo. Inicie el sonido después de que se resuelva, porque el Player carga una aplicación antes de que se muestre su página: una pantalla cuyo navegador permite la reproducción automática lo inicia de inmediato, y en una que la rechaza, play() se rechaza con NotAllowedError; capture el error y reproduzca sin sonido.

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();

Verifique readyState === "active" antes de una llamada SDK desde un controlador de eventos, temporizador o catch, y ponga en cola la entrada que llegue antes. Un log() de un controlador que se ejecuta mientras inert también lanza, lo que puede terminar el inicio antes de que se envíe cualquier evento.

Devuelve
Promise<void>

screenrig.ready()#

Llámelo después de que waitUntilActive() se resuelva y antes de depender de context, kv o nextPage, una vez que la aplicación tenga lo necesario para mostrarse. Si se llama mientras inert, lanza un error.

await window.screenrig.waitUntilActive();
await window.screenrig.ready();
Devuelve
Promise<void>

screenrig.nextPage()#

Llámelo solo en una página de avance de aplicación donde esta primitiva es el controlador, cuando la aplicación haya terminado su turno. Es de un solo uso: una activación obtiene un avance.

window.screenrig.nextPage();

El método es para una página cuyo advance.mode es application, donde este primitivo es el controlador:

{
  "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
    }
  ]
}

Exactamente un primitivo en esa página lleva controller: true y debe ser un primitivo de aplicación. max_ms en el objeto de avance de página delimita el turno.

Requiere
capabilities["page.advance"]
Devuelve
Promise<void>

screenrig.skip(reason)#

Llámelo en lugar de ready() cuando la aplicación no tenga nada que mostrar por ahora. La pantalla pasa de inmediato a la siguiente con la transición normal de la página, y esta aparición no cuenta ninguna reproducción. Es una decisión de arranque: llámelo dentro de los diez segundos posteriores a la activación y antes de 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();
}

El controlador de la página, o la aplicación que está sola en su página, tiene la capacidad, en una página sin imágenes ni video. El método rechaza con capability_denied sin ella, con skip_after_ready una vez que se llamó a ready(), y con not_supported en un Player que no lo admite. Rechaza con forbidden cuando el Player conserva la página: el operador la retiene, la pantalla está apagada, ninguna otra página puede reproducirse, o todas las demás páginas también se han omitido. Entonces muestre su contenido alternativo y llame a ready(). Una lista de reproducción de mosaicos que se omiten todos muestra el último durante todo su tiempo en lugar de dar vueltas. El reason opcional (64 caracteres como máximo) aparece en el registro del Player del proyecto como player.application_skipped. skip() se incluye en el runtime que inyectan app pack y app upload, así que vuelva a empaquetar una versión para darle el método.

Requiere
capabilities["page.skip"]
Devuelve
Promise<void>

screenrig.emit(code)#

Úselo cuando el agente deba ver que algo sucedió: una página terminó un paso, se envió un formulario de kiosco, la aplicación demostró que se ejecutó. Este es un evento de aplicación nombrado, y llega al registro de eventos del proyecto donde el agente lo observa con el CLI incluido events list o events follow. Un código, sin cuerpo de mensaje.

log no es un sustituto. Un diagnóstico no es un evento de aplicación, y un agente que lea el registro de eventos no lo verá.

window.screenrig.emit("menu.rendered");

Los métodos emit() y emitConfirmed() del SDK añaden registros application.event cuyo recurso es la pantalla. Léalos con --type application.event y, opcionalmente, --screen-id. Los campos details.primitive_id y details.code devueltos identifican la primitiva emisora y la acción con nombre. --app-id selecciona eventos del recurso de aplicación, sus versiones y sus entradas K/V, por lo que excluye estos eventos de pantalla.

screenrig events list --type application.event --screen-id scr_SCREEN
ParámetroTipoNotas
codestringSaneado a [A-Za-z0-9._-], máximo 64 caracteres.
Devuelve
void

screenrig.emitConfirmed(code)#

Úselo cuando la aplicación debe saber que el evento llegó: se realizó un pedido en el kiosco, se envió un formulario, una visita terminó. Envía el mismo evento de aplicación nombrado que emit, y su promesa se resuelve solo cuando el Player confirma que el backend aceptó el evento.

Rechaza con el problema del backend cuando se rechaza el evento, y con ack_timeout después de 10 segundos sin respuesta. No reintente automáticamente tras un tiempo de espera: el backend puede ya haber aceptado el evento. Un recibo prueba que el evento está en el registro de eventos del proyecto, no que algo haya actuado aún.

Los recibos funcionan en todos los Player que ejecutan aplicaciones.

await window.screenrig.emitConfirmed("order.placed");
ParámetroTipoNotas
codestringSaneado a [A-Za-z0-9._-], máximo 64 caracteres.
Devuelve
Promise<void>

screenrig.log({ level, code, message })#

Úselo para diagnósticos: el debug, info, warn y error son textos que el Player y el runtime recopilan mientras la aplicación está en pantalla. El runtime inyectado registra a través de este método. El registro está limitado: 32 líneas por cliente y un máximo de 2048 bytes por mensaje. Registre lo que desearía mientras depura, no una línea por cuadro.

No use log cuando quiera decir emit. Los agentes no tratan las líneas de registro como eventos de aplicación, así que todo lo que el agente necesita procesar debe ir en un código emit.

window.screenrig.log({
  level: "warn",
  code: "menu.stale",
  message: "Falling back to the cached menu."
});
CampoTipoNotas
levelstringdebug, info, warn o error.
codestringSaneado a [A-Za-z0-9._-], máximo 64 caracteres.
messagestringMáximo 2048 bytes.
Devuelve
void

screenrig.onResize(handler)#

Suscríbase cuando el diseño pueda cambiar bajo usted en lugar de leer context una vez. El manejador recibe { viewport, primitive }, los mismos dos objetos que context lleva, y la llamada devuelve la función que termina la suscripción.

const stopResize = window.screenrig.onResize(function (size) {
  render(size.viewport, size.primitive);
});

stopResize();
Devuelve
función de cancelación de suscripción

screenrig.onCapabilities(handler)#

Suscríbase cuando las capacidades concedidas puedan cambiar en lugar de decidir una vez al inicio. Lea screenrig.capabilities dentro del manejador para los booleanos actuales y habilite u oculte los controles afectados; la llamada devuelve la función que termina la suscripción.

const stopCapabilities = window.screenrig.onCapabilities(function () {
  saveButton.hidden = !window.screenrig.capabilities["kv.write"];
});
Devuelve
función de cancelación de suscripción

screenrig.destroy()#

Desmonte los escuchas cuando la aplicación termine con el tiempo de ejecución. Una aplicación que se ejecuta durante todo su turno y permite que el Player reemplace el documento no necesita llamarlo.

Devuelve
void

screenrig.kv#

La tienda de clave/valor de la aplicación, para el estado en vivo de la aplicación que sobrevive a una activación. Cinco métodos propios: get, list, set, delete y onChange. Vea la tienda de clave/valor abajo.

Tipo
espacio de nombres

El almacén de clave/valor

Utilice la tienda para el estado en vivo de la aplicación: el menú que la aplicación muestra, el texto que un operador cambió esta mañana, un contador que dejó la última activación. Léalo con kv.get y kv.list, escríbalo con kv.set y kv.delete, y reciba notificaciones de cada cambio con kv.onChange.

La tienda pertenece al id de la aplicación en context.application_id, no a un lanzamiento, por lo que una entrada sobrevive al siguiente app upload. Los valores son bytes, por lo que texto, JSON y binarios pequeños hacen un viaje de ida y vuelta. Las lecturas necesitan kv.read y las escrituras kv.write; verifique la bandera antes de llamar.

La tienda y su actualización de cambios se ejecutan en cada reproductor que ejecuta aplicaciones: la aplicación web del reproductor (PWA), Android, Amazon Signage Stick, macOS, Windows, Linux, Raspberry Pi, LG webOS Signage, BrightSign y Samsung Smart Signage (Tizen). Apple TV, iPhone y iPad no ejecutan aplicaciones; vea soporte de primitivas por plataforma.

screenrig.kv.get(key)#

Leer estado en vivo de la aplicación. Espere la promesa.

const entry = await window.screenrig.kv.get("menu");
Requiere
capabilities["kv.read"]
Devuelve
promesa

screenrig.kv.list()#

Leer estado en vivo de la aplicación cuando aún no conoce las claves: esto lista las claves que la aplicación ha almacenado. Espere la promesa.

const keys = await window.screenrig.kv.list();
Requiere
capabilities["kv.read"]
Devuelve
promesa

screenrig.kv.set(key, value, options)#

Escribir estado de aplicación en vivo. value es una cadena o un Uint8Array; options es opcional.

await window.screenrig.kv.set("menu", JSON.stringify(menu), {
  contentType: "application/json"
});

await window.screenrig.kv.set("badge.png", pngBytes, {
  contentType: "image/png"
});
ParámetroTipoRequeridoNotas
keystringsíVea claves.
valuecadena o Uint8ArraysíLos bytes para almacenar.
options.contentTypestringnoPor defecto es text/plain para una cadena y application/octet-stream para un Uint8Array.
options.expectedRevisionentero no negativonoEscriba solo si la entrada sigue en esta revisión.
options.idempotencyKeystringnoReintentar la misma escritura sin aplicarla dos veces.
Requiere
capabilities["kv.write"]
Devuelve
promesa

screenrig.kv.delete(key, expectedRevision, options)#

Escribir estado de aplicación en vivo eliminando una entrada. expectedRevision es opcional: omítalo para eliminar la entrada actual, o proporciónelo para rechazar cambios concurrentes.

await window.screenrig.kv.delete("menu");
ParámetroTipoRequeridoNotas
keystringsíVea claves.
expectedRevisionentero no negativonoLa revisión en la que estaba la entrada cuando la leyó.
options.idempotencyKeystringnoReintentar la misma eliminación sin aplicarla dos veces.
Requiere
capabilities["kv.write"]
Devuelve
promesa

screenrig.kv.onChange(handler)#

Actualice el estado de la aplicación en vivo en el momento en que cambie en lugar de consultarlo periódicamente. El manejador se ejecuta cada vez que cambia cualquier clave de esta aplicación, quienquiera que la haya escrito: el agente con kv set, un sistema externo a través de un webhook clave/valor, o esta aplicación en cualquier pantalla. Recibe qué clave cambió, no el valor, así que lea el nuevo valor con kv.get. La llamada devuelve la función que termina la suscripción.

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();

Suscríbase antes de la primera lectura, para que no se pierda un cambio que ocurra mientras lee; un manejador registrado antes de la activación comienza una vez que la página está activa. Llame a stopChanges() para finalizar la suscripción.

Un cambio llega a cada pantalla cuya lista de reproducción coloca esta aplicación en segundos. Varias escrituras rápidas a una clave pueden llegar como un cambio que lleva la revisión más reciente, así que trate un cambio como "lea esta clave de nuevo", no como un conteo de escrituras. Un cambio es una señal, no un historial: lea lo que necesite cuando la aplicación inicie, luego siga los cambios.

CampoTipoNotas
keystringLa clave que cambió.
revisionentero, opcionalLa nueva revisión de la entrada. Ausente cuando deleted es true.
deletedbooleantrue cuando se eliminó la clave.
Requiere
capabilities["kv.read"]; sin esto el controlador nunca se ejecuta
Devuelve
función de cancelación de suscripción

Claves

Una clave tiene de 1 a 256 bytes UTF-8. El límite es en bytes, no caracteres, así que una clave con caracteres multibyte lo alcanza antes de lo que su longitud sugiere. Una clave no debe comenzar con _screenrig/; ese prefijo pertenece al runtime inyectado.

Revisiones e idempotencia

Cada entrada lleva una revisión. Opcionalmente pase expectedRevision a screenrig.kv.set o screenrig.kv.delete para escribir solo si la entrada sigue en la revisión que leyó. Una revisión obsoleta significa que alguien más escribió primero: lea la entrada de nuevo, reaplique su cambio y vuelva a intentarlo.

idempotencyKey cubre la otra mitad. Una escritura que puede reintentarse tras una respuesta perdida puede llevar la misma clave en cada intento, y la tienda la aplica una vez.

La misma tienda desde la CLI

El agente puede acceder a estas entradas desde fuera del navegador con los comandos kv del CLI incluido contra el id app_ de app upload. Esa es la vista del operador de la tienda. No sustituye a los cinco métodos anteriores: una aplicación cambia sus propios datos mediante screenrig.kv en el navegador, mientras está en pantalla. Un cambio que escribe el agente llega a la aplicación en ejecución mediante kv.onChange.

Enviar datos desde otro sistema

Un webhook clave/valor es una URL que escribe una clave de esta aplicación. Entréguelo a cualquier cosa que pueda enviar un POST HTTP, como un punto de venta, un script de hoja de cálculo, un trabajo cron o curl, y cada post reemplaza el valor de esa clave. Cada pantalla que ejecuta la aplicación se entera a través de kv.onChange en segundos, sin nueva versión ni agente en el proceso.

El agente crea uno para una clave con el CLI incluido y le entrega su URL y secreto:

screenrig kv webhook create menu --app-id app_01EXAMPLEAPP00000000000 --description "Point of sale menu feed"

La respuesta lleva el url del webhook y su secret (srkw_…). El secreto se muestra solo cuando se crea el webhook y cuando se rota su secreto, así que ingréselo en el sistema de envío de inmediato. La URL no es secreta; el secreto sí lo es.

El remitente publica el nuevo valor como el cuerpo sin procesar de la solicitud, con el secreto en el encabezado 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"}'

Un remitente que solo habla autenticación HTTP Basic usa el id del webhook como nombre de usuario y el secreto como contraseña:

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"}'
  • El cuerpo, como máximo 1 MiB, se convierte en el valor, y Content-Type su tipo de contenido (application/octet-stream cuando falta el encabezado). El valor llega a la aplicación del navegador, así que nunca publique una credencial como tal.
  • Cada publicación es una escritura de clave/valor como kv set: reemplaza el valor, incrementa la revisión y cuenta para el almacenamiento como cualquier otra escritura.
  • La respuesta es los nuevos metadatos de la clave (key, revision, bytes, sha256, content_type y updated_at), nunca su valor.
  • Agregue un encabezado Idempotency-Key (de 8 a 200 caracteres) para reintentar un post de forma segura: dentro de 24 horas la misma clave se aplica una vez, y la misma clave con otro cuerpo o tipo de contenido se rechaza con idempotency_mismatch. Sin uno, cada post es una nueva escritura.
  • Un webhook acepta hasta 120 publicaciones por minuto; pasado eso la respuesta es 429 con Retry-After.
  • Un secreto faltante o incorrecto, o un webhook desconocido, responde 401. Nunca se acepta un secreto en la URL o cadena de consulta.
  • Una aplicación tiene hasta 20 webhooks. kv webhook rotate-secret emite un nuevo secreto y el antiguo se detiene de inmediato; kv webhook delete detiene la URL de inmediato y deja el valor de la clave en su lugar.

Una tarjeta también admite webhooks: un envío construye su documento de datos, tal cual o mediante un mapeo (Webhooks de tarjeta).

Comandos webhook clave/valor →

El dispositivo

Una aplicación que maneja un panel de pared o un kiosco puede controlar la pantalla en la que se ejecuta. Los flags device se entregan al frame que controla su página (el controlador de la página, o su única aplicación) en un Player que puede hacer el trabajo en ese dispositivo: el Player Android concede device.display, device.keys y device.network, concede device.presence cuando el dispositivo tiene cámara y la persona que configuró el dispositivo permitió que el Player la use (Ajustes de Android, Aplicaciones, screenRIG Player, Permisos, Cámara), device.light cuando tiene un sensor de luz y device.haptics cuando tiene un motor de vibración. Los Players que no pueden controlar un dispositivo dejan en false todos los flags device. display.get(), display.set() y vibrate() rechazan con not_supported en un Player que no los ofrece y con capability_denied sin el flag. onDisplay, onPresence, onKey, onLight y onNetwork pueden registrarse en cualquier momento y, como kv.onChange, simplemente nunca se ejecutan sin el flag.

screenrig.device.display.set(state)#

Atenuar, oscurecer o activar la pantalla. brightness va de 0 a 1 (0 es lo más bajo que llega la retroiluminación, no apagado); on: false oscurece la pantalla y on: true la vuelve a encender. Omita un miembro para dejarlo como está. Los toques siguen llegando a la aplicación mientras la pantalla está oscura, así que un toque puede activarla. Un horario de pantalla que mantiene la pantalla oscura prevalece sobre la aplicación, y el Player restaura la pantalla cuando la página deja de mostrarse.

await window.screenrig.device.display.set({ brightness: 0.3 });
await window.screenrig.device.display.set({ on: false });
Se resuelve con
{ on, brightness }, la pantalla después de la llamada (brightness es null cuando el Player no puede leerlo); set({}) solo lee, y brightness conserva su valor mientras la pantalla está oscura
Requiere
capabilities["device.display"]

screenrig.device.display.get()#

El estado actual de la pantalla, como { on, brightness }.

Requiere
capabilities["device.display"]

screenrig.device.onDisplay(handler)#

Se llama con { on, brightness } cada vez que cambia la pantalla, ya sea que la haya cambiado esta aplicación, un horario de pantalla o un operador.

Devuelve
función de cancelación de suscripción
Requiere
capabilities["device.display"]

screenrig.device.onPresence(handler)#

Se llama cuando el dispositivo ve a alguien moverse frente a la pantalla, como máximo una vez por segundo. El Player lee la cámara del dispositivo y no conserva ninguna imagen: no se almacena, registra ni envía ninguna imagen. La cámara funciona solo mientras haya un manejador registrado.

window.screenrig.device.onPresence(function () {
  window.screenrig.device.display.set({ on: true, brightness: 1 });
});
Devuelve
función de cancelación de suscripción
Requiere
capabilities["device.presence"]

screenrig.device.onKey(handler)#

Se llama con "volume_up" o "volume_down" en cada pulsación de una tecla de volumen física, incluidas las repeticiones. Mientras haya un manejador registrado, las teclas pertenecen a la aplicación y el volumen del dispositivo no cambia.

Devuelve
función de cancelación de suscripción
Requiere
capabilities["device.keys"]

screenrig.device.onLight(handler)#

Se llama con la luz ambiental en lux: la primera lectura tras registrar el manejador y después cada vez que la luz cambia al menos un 10 % o en 1 lux, como máximo una vez por segundo. El dispositivo necesita un sensor de luz.

window.screenrig.device.onLight(function (lux) {
  document.body.classList.toggle("dim-room", lux < 10);
});
Devuelve
función de cancelación de suscripción
Requiere
capabilities["device.light"]

screenrig.device.onNetwork(handler)#

Se llama con true o false cada vez que el dispositivo obtiene o pierde la conectividad a internet validada por el sistema, y de inmediato con el estado actual cuando se registra el primer manejador.

window.screenrig.device.onNetwork(function (online) {
  offlineBadge.hidden = online;
});
Devuelve
función de cancelación de suscripción
Requiere
capabilities["device.network"]

screenrig.device.vibrate(ms)#

Emita un pulso háptico. ms es un número entero de milisegundos de 1 a 200 y por defecto es 12. La promesa se resuelve sin valor cuando el Player ha iniciado la vibración, y se rechaza con invalid_request, sin enviar nada, para cualquier otro ms.

await window.screenrig.device.vibrate();
await window.screenrig.device.vibrate(40);
Se resuelve con
sin valor
Requiere
capabilities["device.haptics"]

Acceder a dispositivos de la red de la pantalla

Una aplicación puede obtener datos de direcciones http:// y ws:// además de https://, por lo que puede comunicarse con un dispositivo o servidor de la propia red de la pantalla, como un controlador en http://192.168.1.20. Los Players de Android, Linux y Raspberry Pi, Windows y macOS lo permiten. En un navegador de kiosco que ejecuta la app web del Player, el propietario del navegador lo permite con una política empresarial: consulte Aplicaciones en la red local. El servidor al que llama responde a CORS para el origen de la aplicación; en macOS las solicitudes de una aplicación llevan Origin: null, así que el CORS del servidor permite ese origen allí.

Un motor de navegador bloquea <img src="http://…"> en una página segura, así que cargue las imágenes desde una dirección http:// con fetch() y URL.createObjectURL().

const response = await fetch("http://192.168.1.20/snapshot.jpg");
image.src = URL.createObjectURL(await response.blob());

Construya y coloque la app