Aplicación de Android
Instantánea de soporte
Sección titulada «Instantánea de soporte»- Rol: aplicación de nodo complementario (Android no aloja el Gateway).
- Se requiere Gateway: sí (ejecútelo en macOS, Linux o Windows a través de WSL2).
- Instalación: Google Play para la aplicación, Introducción para el Gateway y luego Emparejamiento.
- Gateway: Manual + Configuración.
- Protocolos: Protocolo de Gateway (nodos + plano de control).
Control del sistema
Sección titulada «Control del sistema»El control del sistema (launchd/systemd) se encuentra en el host del Gateway. Consulte Gateway.
Manual de conexión
Sección titulada «Manual de conexión»Aplicación de nodo Android ⇄ (mDNS/NSD + WebSocket) ⇄ Gateway
Android se conecta directamente al WebSocket del Gateway y utiliza el emparejamiento de dispositivos (role: node).
Para Tailscale o hosts públicos, Android requiere un punto de conexión seguro:
- Preferido: Tailscale Serve / Funnel con
https://<magicdns>/wss://<magicdns> - También compatible: cualquier otra URL de Gateway
wss://con un punto de conexión TLS real - El texto sin cifrar
ws://sigue siendo compatible en direcciones LAN privadas / hosts.local, además delocalhost,127.0.0.1y el puente del emulador de Android (10.0.2.2)
Requisitos previos
Sección titulada «Requisitos previos»- Puede ejecutar el Gateway en la máquina “maestra”.
- El dispositivo/emulador de Android puede alcanzar el WebSocket del Gateway:
- Misma LAN con mDNS/NSD, o
- Misma tailnet de Tailscale usando Wide-Area Bonjour / unicast DNS-SD (ver abajo), o
- Host/puerto de puerta de enlace manual (alternativa)
- El emparejamiento móvil de Tailnet/público no utiliza puntos finales de IP
ws://sin procesar de Tailnet. Utilice Tailscale Serve u otra URLwss://en su lugar. - Puede ejecutar la CLI (
openclaw) en la máquina de la puerta de enlace (o a través de SSH).
1) Iniciar la puerta de enlace
Sección titulada «1) Iniciar la puerta de enlace»openclaw gateway --port 18789 --verboseConfirme en los registros que ve algo como:
listening on ws://0.0.0.0:18789
Para el acceso remoto de Android a través de Tailscale, prefiera Serve/Funnel en lugar de un enlace de Tailnet sin procesar:
openclaw gateway --tailscale serveEsto proporciona a Android un punto final seguro wss:// / https://. Una configuración gateway.bind: "tailnet" simple no es suficiente para el primer emparejamiento remoto de Android a menos que también finalice TLS por separado.
2) Verificar el descubrimiento (opcional)
Sección titulada «2) Verificar el descubrimiento (opcional)»Desde la máquina de la puerta de enlace:
dns-sd -B _openclaw-gw._tcp local.Más notas de depuración: Bonjour.
Si también configuró un dominio de descubrimiento de área amplia, compare con:
openclaw gateway discover --jsonEso muestra local. más el dominio de área amplia configurado en una sola pasada y utiliza el punto final del servicio resuelto en lugar de solo pistas TXT.
Descubrimiento de Tailnet (Viena ⇄ Londres) a través de DNS-SD unicast
Sección titulada «Descubrimiento de Tailnet (Viena ⇄ Londres) a través de DNS-SD unicast»El descubrimiento NSD/mDNS de Android no cruzará redes. Si su nodo Android y la puerta de enlace están en redes diferentes pero conectados a través de Tailscale, utilice Wide-Area Bonjour / unicast DNS-SD en su lugar.
El descubrimiento por sí solo no es suficiente para el emparejamiento de Android de Tailnet/público. La ruta descubierta aún necesita un punto final seguro (wss:// o Tailscale Serve):
- Configure una zona DNS-SD (ejemplo
openclaw.internal.) en el host de la puerta de enlace y publique registros_openclaw-gw._tcp. - Configure el DNS dividido de Tailscale para su dominio elegido apuntando a ese servidor DNS.
Detalles y configuración de ejemplo de CoreDNS: Bonjour.
3) Conectar desde Android
Sección titulada «3) Conectar desde Android»En la aplicación de Android:
- La aplicación mantiene su conexión con la puerta de enlace activa a través de un servicio en primer plano (notificación persistente).
- Abra la pestaña Conectar.
- Use el modo Código de configuración o Manual.
- Si el descubrimiento está bloqueado, use el host/puerto manual en Controles avanzados. Para hosts de LAN privados,
ws://todavía funciona. Para hosts de Tailscale/públicos, active TLS y use un punto finalwss:/// Tailscale Serve.
Después del primer emparejamiento exitoso, Android se reconecta automáticamente al inicio:
- Punto final manual (si está habilitado), de lo contrario,
- La última puerta de enlace descubierta (mejor esfuerzo).
Balizas de presencia activas
Sección titulada «Balizas de presencia activas»Después de que se conecte la sesión del nodo autenticado y cuando la aplicación pase a segundo plano mientras el servicio en primer plano todavía está conectado, Android llama a node.event con event: "node.presence.alive". La puerta de enlace registra esto como lastSeenAtMs/lastSeenReason en los metadatos del nodo/dispositivo emparejado solo después de que se conoce la identidad del dispositivo del nodo autenticado.
La aplicación cuenta la baliza como registrada exitosamente solo cuando la respuesta de la puerta de enlace incluye handled: true. Las puertas de enlace antiguas pueden reconocer node.event con { "ok": true }; esa respuesta es compatible pero no cuenta como una actualización duradera de la última vez visto.
4) Aprobar el emparejamiento (CLI)
Sección titulada «4) Aprobar el emparejamiento (CLI)»En la máquina de la puerta de enlace:
openclaw devices listopenclaw devices approve <requestId>openclaw devices reject <requestId>Detalles del emparejamiento: Emparejamiento.
Opcional: si el nodo de Android siempre se conecta desde una subred estrictamente controlada, puede optar por la autoaprobación de nodo por primera vez con CIDR explícitos o IPs exactas:
{ gateway: { nodes: { pairing: { autoApproveCidrs: ["192.168.1.0/24"], }, }, },}Esto está deshabilitado de forma predeterminada. Solo se aplica al emparejamiento role: node nuevo sin alcances solicitados. El emparejamiento del operador/navegador y cualquier cambio de rol, alcance, metadatos o clave pública aún requieren aprobación manual.
5) Verificar que el nodo esté conectado
Sección titulada «5) Verificar que el nodo esté conectado»-
A través del estado de los nodos:
Ventana de terminal openclaw nodes status -
A través de la puerta de enlace:
Ventana de terminal openclaw gateway call node.list --params "{}"
6) Chat + historial
Sección titulada «6) Chat + historial»La pestaña Chat de Android admite la selección de sesión (predeterminado main, más otras sesiones existentes):
- Historial:
chat.history(normalizado para visualización; las etiquetas de directivas en línea se eliminan del texto visible, las cargas útiles XML de llamadas a herramientas en texto plano (incluyendo<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>, y bloques de llamadas a herramientas truncados) y los tokens de control de modelo ASCII/anchura completa filtrados se eliminan, las filas del asistente de tokens silenciosos puros comoNO_REPLY/no_replyexactos se omiten, y las filas demasiado grandes pueden ser reemplazadas por marcadores de posición) - Enviar:
chat.send - Actualizaciones push (mejor esfuerzo):
chat.subscribe→event:"chat"
7) Canvas + cámara
Sección titulada «7) Canvas + cámara»Host de Canvas del Gateway (recomendado para contenido web)
Sección titulada «Host de Canvas del Gateway (recomendado para contenido web)»Si desea que el nodo muestre HTML/CSS/JS real que el agente pueda editar en el disco, apunte el nodo al host de canvas del Gateway.
-
Cree
~/.openclaw/workspace/canvas/index.htmlen el host del gateway. -
Navegue el nodo hacia él (LAN):
openclaw nodes invoke --node "<Android Node>" --command canvas.navigate --params '{"url":"http://<gateway-hostname>.local:18789/__openclaw__/canvas/"}'Tailnet (opcional): si ambos dispositivos están en Tailscale, use un nombre MagicDNS o una IP de tailnet en lugar de .local, p. ej. http://<gateway-magicdns>:18789/__openclaw__/canvas/.
Este servidor inyecta un cliente de recarga en vivo en el HTML y recarga ante cambios en los archivos.
El host A2UI se encuentra en http://<gateway-host>:18789/__openclaw__/a2ui/.
Comandos de Canvas (solo en primer plano):
canvas.eval,canvas.snapshot,canvas.navigate(use{"url":""}o{"url":"/"}para volver al andamio predeterminado).canvas.snapshotdevuelve{ format, base64 }(por defectoformat="jpeg").- A2UI:
canvas.a2ui.push,canvas.a2ui.reset(canvas.a2ui.pushJSONLalias heredado)
Comandos de cámara (solo en primer plano; restringidos por permisos):
camera.snap(jpg)camera.clip(mp4)
Consulte Nodo de cámara para conocer los parámetros y los auxiliares de CLI.
8) Voz + superficie de comandos Android ampliada
Sección titulada «8) Voz + superficie de comandos Android ampliada»- Pestaña de voz: Android tiene dos modos de captura explícitos. Mic es una sesión manual de la pestaña de voz que envía cada pausa como un turno de chat y se detiene cuando la aplicación sale del primer plano o el usuario sale de la pestaña de voz. Talk es el Modo de conversación continuo y sigue escuchando hasta que se desactiva o el nodo se desconecta.
- El Modo de conversación promueve el servicio en primer plano existente de
dataSyncadataSync|microphoneantes de que comience la captura, y luego lo degrada cuando se detiene el Modo de conversación. Android 14+ requiere la declaraciónFOREGROUND_SERVICE_MICROPHONE, la concesión de tiempo de ejecuciónRECORD_AUDIOy el tipo de servicio de micrófono en tiempo de ejecución. - De forma predeterminada, Android Talk usa el reconocimiento de voz nativo, el chat de la puerta de enlace y
talk.speaka través del proveedor Talk de la puerta de enlace configurada. El TTS del sistema local se usa solo cuandotalk.speakno está disponible. - Android Talk usa el relé de puerta de enlace en tiempo real solo cuando
talk.realtime.modeesrealtimeytalk.realtime.transportesgateway-relay. - La activación por voz permanece deshabilitada en la experiencia de usuario/tiempo de ejecución de Android.
- Familias de comandos adicionales de Android (la disponibilidad depende del dispositivo + permisos):
device.status,device.info,device.permissions,device.healthnotifications.list,notifications.actions(ver Reenvío de notificaciones a continuación)photos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
Puntos de entrada del asistente
Sección titulada «Puntos de entrada del asistente»Android admite el inicio de OpenClaw desde el disparador del asistente del sistema (Google Assistant). Cuando está configurado, mantener presionado el botón de inicio o decir “Hey Google, pregúntale a OpenClaw…” abre la aplicación y pasa el mensaje al compositor de chat.
Esto utiliza los metadatos de App Actions de Android declarados en el manifiesto de la aplicación. No se necesita ninguna configuración adicional en el lado de la puerta de enlace; la intención del asistente se maneja completamente por la aplicación de Android y se reenvía como un mensaje de chat normal.
Reenvío de notificaciones
Sección titulada «Reenvío de notificaciones»Android puede reenviar las notificaciones del dispositivo a la puerta de enlace como eventos. Varios controles le permiten limitar qué notificaciones se reenvían y cuándo.
| Clave | Tipo | Descripción |
|---|---|---|
notifications.allowPackages | string[] | Reenviar solo las notificaciones de estos nombres de paquete. Si se establece, se ignoran todos los demás paquetes. |
notifications.denyPackages | string[] | Nunca reenviar notificaciones de estos nombres de paquete. Se aplica después de allowPackages. |
notifications.quietHours.start | cadena (HH:mm) | Inicio de la ventana de horas silenciosas (hora local del dispositivo). Las notificaciones se suprimen durante esta ventana. |
notifications.quietHours.end | cadena (HH:mm) | Fin de la ventana de horas silenciosas. |
notifications.rateLimit | número | Máximo de notificaciones reenviadas por paquete por minuto. Las notificaciones excesivas se descartan. |
El selector de notificaciones también utiliza un comportamiento más seguro para los eventos de notificación reenviados, evitando el reenvío accidental de notificaciones confidenciales del sistema.
Configuración de ejemplo:
{ notifications: { allowPackages: ["com.slack", "com.whatsapp"], denyPackages: ["com.android.systemui"], quietHours: { start: "22:00", end: "07:00", }, rateLimit: 5, },}