Aplicación de Android
Aplicación de Android (Nodo)
Sección titulada «Aplicación de Android (Nodo)»Nota: La aplicación de Android aún no se ha lanzado públicamente. El código fuente está disponible en el repositorio OpenClaw bajo
apps/android. Puedes compilarla tú mismo usando Java 17 y el Android SDK (./gradlew :app:assemblePlayDebug). Consulta apps/android/README.md para obtener instrucciones de compilación.
Instantánea de compatibilidad
Sección titulada «Instantánea de compatibilidad»- Rol: aplicación de nodo complementario (Android no aloja el Gateway).
- Gateway requerido: sí (ejecútelo en macOS, Linux o Windows a través de WSL2).
- Instalación: Introducción + 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 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 (por defecto ws://<host>:18789) y usa emparejamiento de dispositivos (role: node).
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 red tailnet de Tailscale usando Wide-Area Bonjour / DNS-SD unicast (ver abajo), o
- Host/puerto del gateway manual (alternativo)
- Puede ejecutar la CLI (
openclaw) en la máquina gateway (o vía SSH).
1) Iniciar el Gateway
Sección titulada «1) Iniciar el Gateway»openclaw gateway --port 18789 --verboseConfirme en los registros que ve algo como:
listening on ws://0.0.0.0:18789
Para configuraciones solo tailnet (recomendado para Viena ⇄ Londres), vincule el gateway a la IP de tailnet:
- Configure
gateway.bind: "tailnet"en~/.openclaw/openclaw.jsonen el host gateway. - Reinicie el Gateway / la aplicación de la barra de menús de macOS.
2) Verificar el descubrimiento (opcional)
Sección titulada «2) Verificar el descubrimiento (opcional)»Desde la máquina del gateway:
dns-sd -B _openclaw-gw._tcp local.Más notas de depuración: Bonjour.
Descubrimiento de Tailnet (Viena ⇄ Londres) mediante DNS-SD unicast
Sección titulada «Descubrimiento de Tailnet (Viena ⇄ Londres) mediante DNS-SD unicast»El descubrimiento de NSD/mDNS de Android no cruzará redes. Si su nodo de Android y la puerta de enlace están en redes diferentes pero conectados a través de Tailscale, use Wide-Area Bonjour / DNS-SD unicast en su lugar:
- Configure una zona DNS-SD (ejemplo
openclaw.internal.) en el host gateway 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 de 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 host/puerto manual (y TLS/token/contraseña cuando sea necesario) en Controles avanzados.
Después del primer emparejamiento exitoso, Android se vuelve a conectar automáticamente al inicio:
- Endpoint manual (si está habilitado), de lo contrario,
- La última puerta de enlace descubierta (best-effort).
4) Aprobar emparejamiento (CLI)
Sección titulada «4) Aprobar 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.
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 (por defecto main, más otras sesiones existentes):
- Historial:
chat.history - Enviar:
chat.send - Actualizaciones automáticas (best-effort):
chat.subscribe→event:"chat"
7) Canvas + cámara
Sección titulada «7) Canvas + cámara»Host de Canvas de puerta de enlace (recomendado para contenido web)
Sección titulada «Host de Canvas de puerta de enlace (recomendado para contenido web)»Si desea que el nodo muestre HTML/CSS/JS real que el agente pueda editar en el disco, dirija el nodo al host de canvas de la puerta de enlace.
Nota: los nodos cargan el lienzo desde el servidor HTTP del Gateway (mismo puerto que gateway.port, por defecto 18789).
-
Cree
~/.openclaw/workspace/canvas/index.htmlen el host de la puerta de enlace. -
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, utilice un nombre MagicDNS o una IP de tailnet en lugar de .local, por ejemplo http://<gateway-magicdns>:18789/__openclaw__/canvas/.
Este servidor inyecta un cliente de recarga en vivo en el HTML y se recarga cuando se cambian los archivos.
El host A2UI vive 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 las herramientas de la CLI.
8) Voz + superficie de comandos de Android ampliada
Sección titulada «8) Voz + superficie de comandos de Android ampliada»- Voz: Android utiliza un único flujo de activación/desactivación del micrófono en la pestaña Voz con captura de transcripciones y reproducción TTS (ElevenLabs cuando está configurado, TTS del sistema como alternativa). La voz se detiene cuando la aplicación sale del primer plano.
- Los interruptores de modo de activación/conversación de voz se han eliminado actualmente de 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(consulte Reenvío de notificaciones a continuación)photos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
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 determinar qué notificaciones se reenvían y cuándo.
| Clave | Tipo | Descripción |
|---|---|---|
notifications.allowPackages | string[] | Solo reenviar notificaciones de estos nombres de paquetes. Si se establece, se ignoran todos los demás paquetes. |
notifications.denyPackages | string[] | Nunca reenviar notificaciones de estos nombres de paquetes. 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 en exceso 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, },}