Android-App (Node)

Hinweis: Die Android-App wurde noch nicht öffentlich veröffentlicht. Der Quellcode ist im OpenClaw-Repository unter apps/android verfügbar. Du kannst sie selbst mit Java 17 und dem Android SDK bauen (./gradlew :app:assembleDebug). Build-Anleitung: apps/android/README.md.

Support-Übersicht

Systemsteuerung

Die Systemsteuerung (launchd/systemd) befindet sich auf dem Gateway-Host. Siehe Gateway.

Verbindungs-Runbook

Android-Node-App ⇄ (mDNS/NSD + WebSocket) ⇄ Gateway

Android verbindet sich direkt mit dem Gateway-WebSocket (Standard ws://<host>:18789) und nutzt Device-Pairing (role: node).

Voraussetzungen

  • Du kannst das Gateway auf dem „Master”-Gerät ausführen.
  • Android-Gerät/Emulator kann den Gateway-WebSocket erreichen:
    • Gleiches LAN mit mDNS/NSD, oder
    • Gleiches Tailscale-Tailnet mit Wide-Area Bonjour / Unicast DNS-SD (siehe unten), oder
    • Manueller Gateway-Host/Port (Fallback)
  • Du kannst die CLI (openclaw) auf dem Gateway-Gerät ausführen (oder via SSH).

1) Gateway starten

openclaw gateway --port 18789 --verbose

Stelle in den Logs sicher, dass du so etwas siehst:

  • listening on ws://0.0.0.0:18789

Für reine Tailnet-Setups (empfohlen für Wien ⇄ London), binde das Gateway an die Tailnet-IP:

  • Setze gateway.bind: "tailnet" in ~/.openclaw/openclaw.json auf dem Gateway-Host.
  • Starte das Gateway / die macOS-Menüleisten-App neu.

2) Discovery prüfen (optional)

Vom Gateway-Gerät aus:

dns-sd -B _openclaw-gw._tcp local.

Weitere Debugging-Hinweise: Bonjour.

Tailnet-Discovery (Wien ⇄ London) via Unicast DNS-SD

Android NSD/mDNS-Discovery funktioniert nicht netzwerkübergreifend. Wenn dein Android-Node und das Gateway in verschiedenen Netzwerken sind, aber über Tailscale verbunden, nutze stattdessen Wide-Area Bonjour / Unicast DNS-SD:

  1. Richte eine DNS-SD-Zone (z. B. openclaw.internal.) auf dem Gateway-Host ein und veröffentliche _openclaw-gw._tcp-Records.
  2. Konfiguriere Tailscale Split DNS für deine gewählte Domain, die auf diesen DNS-Server zeigt.

Details und CoreDNS-Beispielkonfiguration: Bonjour.

3) Von Android verbinden

In der Android-App:

  • Die App hält ihre Gateway-Verbindung über einen Vordergrund-Service (permanente Benachrichtigung) aufrecht.
  • Öffne den Connect-Tab.
  • Verwende den Setup Code oder den Manual-Modus.
  • Falls die Discovery blockiert ist, verwende manuellen Host/Port (und TLS/Token/Passwort falls nötig) unter Erweiterte Einstellungen.

Nach dem ersten erfolgreichen Pairing verbindet sich Android beim Start automatisch wieder:

  • Manueller Endpunkt (falls aktiviert), ansonsten
  • Das zuletzt entdeckte Gateway (Best-Effort).

4) Pairing genehmigen (CLI)

Auf dem Gateway-Gerät:

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

Pairing-Details: Pairing.

5) Prüfen, ob der Node verbunden ist

  • Via Node-Status:

    openclaw nodes status
  • Via Gateway:

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

6) Chat + Verlauf

Der Android-Chat-Tab unterstützt Sitzungsauswahl (Standard main, plus weitere vorhandene Sitzungen):

  • Verlauf: chat.history
  • Senden: chat.send
  • Push-Updates (Best-Effort): chat.subscribeevent:"chat"

7) Canvas + Kamera

Gateway Canvas Host (empfohlen für Web-Inhalte)

Wenn der Node echtes HTML/CSS/JS anzeigen soll, das der Agent auf der Festplatte bearbeiten kann, richte den Node auf den Gateway Canvas Host.

Hinweis: Nodes laden Canvas vom Gateway HTTP-Server (gleicher Port wie gateway.port, Standard 18789).

  1. Erstelle ~/.openclaw/workspace/canvas/index.html auf dem Gateway-Host.

  2. Navigiere den Node dorthin (LAN):

openclaw nodes invoke --node "<Android Node>" --command canvas.navigate --params '{"url":"http://<gateway-hostname>.local:18789/__openclaw__/canvas/"}'

Tailnet (optional): Wenn beide Geräte im Tailscale sind, verwende einen MagicDNS-Namen oder die Tailnet-IP statt .local, z. B. http://<gateway-magicdns>:18789/__openclaw__/canvas/.

Dieser Server injiziert einen Live-Reload-Client in HTML und lädt bei Dateiänderungen neu. Der A2UI-Host befindet sich unter http://<gateway-host>:18789/__openclaw__/a2ui/.

Canvas-Befehle (nur im Vordergrund):

  • canvas.eval, canvas.snapshot, canvas.navigate (verwende {"url":""} oder {"url":"/"} um zum Standard-Scaffold zurückzukehren). canvas.snapshot gibt { format, base64 } zurück (Standard format="jpeg").
  • A2UI: canvas.a2ui.push, canvas.a2ui.reset (canvas.a2ui.pushJSONL Legacy-Alias)

Kamera-Befehle (nur im Vordergrund; berechtigungsgesteuert):

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

Siehe Kamera-Node für Parameter und CLI-Helfer.

8) Voice + erweiterte Android-Befehlsoberfläche

  • Voice: Android nutzt einen einfachen Mikrofon-An/Aus-Flow im Voice-Tab mit Transkript-Erfassung und TTS-Wiedergabe (ElevenLabs wenn konfiguriert, System-TTS als Fallback). Voice stoppt, wenn die App den Vordergrund verlässt.
  • Voice Wake/Talk-Mode-Toggles sind derzeit aus der Android-UX/Runtime entfernt.
  • Weitere Android-Befehlsfamilien (Verfügbarkeit hängt vom Gerät + Berechtigungen ab):
    • 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