App para Android (Nodo)

Nota: La app de Android aún no se ha publicado oficialmente. El código fuente está disponible en el repositorio de OpenClaw en apps/android. Puedes compilarla tú mismo usando Java 17 y el Android SDK (./gradlew :app:assembleDebug). Consulta apps/android/README.md para instrucciones de compilación.

Resumen de compatibilidad

Control del sistema

El control del sistema (launchd/systemd) reside en el host del Gateway. Consulta Gateway.

Guía de conexión

App nodo Android ⇄ (mDNS/NSD + WebSocket) ⇄ Gateway

Android se conecta directamente al WebSocket del Gateway (por defecto ws://<host>:18789) y utiliza el emparejamiento de dispositivos (role: node).

Requisitos previos

  • Puedes ejecutar el Gateway en la máquina “maestra”.
  • El dispositivo Android o emulador puede alcanzar el WebSocket del Gateway:
    • Misma LAN con mDNS/NSD, o
    • Misma tailnet de Tailscale usando Wide-Area Bonjour / DNS-SD unicast (ver más abajo), o
    • Host/puerto manual del Gateway (alternativa)
  • Puedes ejecutar el CLI (openclaw) en la máquina del Gateway (o vía SSH).

1) Iniciar el Gateway

openclaw gateway --port 18789 --verbose

Confirma en los logs que ves algo como:

  • listening on ws://0.0.0.0:18789

Para configuraciones exclusivas de tailnet (recomendado para Vienna ⇄ London), vincula el Gateway a la IP de tailnet:

  • Configura gateway.bind: "tailnet" en ~/.openclaw/openclaw.json en el host del Gateway.
  • Reinicia el Gateway o la app de la barra de menú de macOS.

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 por tailnet (Vienna ⇄ London) vía DNS-SD unicast

El descubrimiento NSD/mDNS de Android no cruza redes. Si tu nodo Android y el Gateway están en redes diferentes pero conectados vía Tailscale, usa Wide-Area Bonjour / DNS-SD unicast en su lugar:

  1. Configura una zona DNS-SD (ejemplo openclaw.internal.) en el host del Gateway y publica registros _openclaw-gw._tcp.
  2. Configura el split DNS de Tailscale para el dominio elegido apuntando a ese servidor DNS.

Detalles y ejemplo de configuración CoreDNS: Bonjour.

3) Conectar desde Android

En la app de Android:

  • La app mantiene la conexión al Gateway activa mediante un servicio en primer plano (notificación persistente).
  • Abre la pestaña Connect.
  • Usa el modo Setup Code o Manual.
  • Si el descubrimiento está bloqueado, usa host/puerto manual (y TLS/token/contraseña cuando sea necesario) en Advanced controls.

Tras el primer emparejamiento exitoso, Android se reconecta automáticamente al iniciar:

  • Endpoint manual (si está habilitado), en caso contrario
  • El último Gateway descubierto (mejor esfuerzo).

4) Aprobar el emparejamiento (CLI)

En la máquina del Gateway:

openclaw devices list
openclaw devices approve <requestId>
openclaw devices reject <requestId>

Detalles del emparejamiento: Emparejamiento.

5) Verificar que el nodo está conectado

  • Vía estado de nodos:

    openclaw nodes status
  • Vía Gateway:

    openclaw gateway call node.list --params "{}"

6) Chat + historial

La pestaña Chat de Android soporta selección de sesión (por defecto main, más otras sesiones existentes):

  • Historial: chat.history
  • Enviar: chat.send
  • Actualizaciones push (mejor esfuerzo): chat.subscribeevent:"chat"

7) Canvas + cámara

Gateway Canvas Host (recomendado para contenido web)

Si quieres que el nodo muestre HTML/CSS/JS real que el agente puede editar en disco, apunta el nodo al host canvas del Gateway.

Nota: los nodos cargan el canvas desde el servidor HTTP del Gateway (mismo puerto que gateway.port, por defecto 18789).

  1. Crea ~/.openclaw/workspace/canvas/index.html en el host del Gateway.

  2. Navega 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, usa un nombre MagicDNS o 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 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 (usa {"url":""} o {"url":"/"} para volver al scaffold predeterminado). canvas.snapshot devuelve { format, base64 } (por defecto format="jpeg").
  • A2UI: canvas.a2ui.push, canvas.a2ui.reset (canvas.a2ui.pushJSONL alias legacy)

Comandos de cámara (solo en primer plano; requieren permiso):

  • camera.snap (jpg)
  • camera.clip (mp4)

Consulta Nodo de cámara para parámetros y helpers del CLI.

8) Voz + superficie de comandos extendida de Android

  • Voz: Android usa un flujo simple de micrófono on/off en la pestaña Voice con captura de transcripción y reproducción TTS (ElevenLabs cuando está configurado, TTS del sistema como alternativa). La voz se detiene cuando la app sale del primer plano.
  • Los toggles de wake/talk-mode están actualmente eliminados del UX/runtime de Android.
  • Familias de comandos adicionales de Android (la disponibilidad depende del dispositivo y los permisos):
    • device.status, device.info, device.permissions, device.health
    • notifications.list, notifications.actions
    • photos.latest
    • contacts.search, contacts.add
    • calendar.events, calendar.add
    • motion.activity, motion.pedometer