From 47cc1b7f08ab1e7b50cadf5e9e9c55907c10e5c4 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Fri, 25 Sep 2026 13:44:49 +0200 Subject: [PATCH] =?UTF-8?q?feat(android-agent):=20Sperre-Erkennung=20?= =?UTF-8?q?=E2=80=94=20Steuern=20nur=20entsperrt=20(v0.0.0.7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Erkenntnis aus dem Live-Test: bei gesperrtem Bildschirm greifen Gesten/Tasten nicht (Android-Sicherheit), der Agent meldete aber still 'ok' -> Verwirrung (home,home,home, Screenshot zeigt trotzdem alte App). Fix: KeyguardManager. isKeyguardLocked() gate fuer Steuer-Aktionen (ui_tap/text/swipe/key/app_launch) -> klare Meldung 'Geraet ist gesperrt - bitte entsperren'. Sehen (screenshot/ ui_dump/info) bleibt auch gesperrt erlaubt. README-Hinweis ergaenzt. Co-Authored-By: Claude Opus 4.8 --- host-agent/android/README.md | 7 +++++++ host-agent/android/app/build.gradle | 4 ++-- .../main/java/de/hackersoft/ariaagent/RvsClient.kt | 13 +++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/host-agent/android/README.md b/host-agent/android/README.md index 802014f..38a7f10 100644 --- a/host-agent/android/README.md +++ b/host-agent/android/README.md @@ -46,6 +46,13 @@ ARIA-Flow „E-Mail einrichten": `app_launch` (Mail-App) → `screenshot`/`ui_du (sehen, was da ist) → `ui_tap`/`ui_text` (durchklicken) → wieder `ui_dump` prüfen, bis fertig. Genau das agentische Muster wie beim Endian-Fix, nur mit Handy-UI. +> **⚠️ Gerät muss ENTSPERRT sein, damit ARIA es steuern kann.** Gesten und +> Systemtasten (`ui_tap`/`ui_text`/`ui_swipe`/`ui_key`/`app_launch`) greifen bei +> gesperrtem Bildschirm nicht — Android-Sicherheit. Der Agent erkennt das und +> meldet „Gerät ist gesperrt — bitte erst entsperren", statt still „ok" zu sagen. +> **Sehen** (`screenshot`, `ui_dump`, `info`) funktioniert dagegen auch bei +> gesperrtem Gerät. + ## Dauerbetrieb — Foreground-Service vs. Push (FCM) Der Agent muss **immer erreichbar** sein, obwohl Android Hintergrundprozesse diff --git a/host-agent/android/app/build.gradle b/host-agent/android/app/build.gradle index 17a0335..dc61aeb 100644 --- a/host-agent/android/app/build.gradle +++ b/host-agent/android/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId 'de.hackersoft.ariaagent' minSdk 26 targetSdk 33 // 33 vermeidet die Foreground-Service-Typ-Pflicht von 34 - versionCode 6 - versionName '0.0.0.6' + versionCode 7 + versionName '0.0.0.7' } // Fester Signaturschlüssel: jeder Build signiert mit DEMSELBEN Key, damit diff --git a/host-agent/android/app/src/main/java/de/hackersoft/ariaagent/RvsClient.kt b/host-agent/android/app/src/main/java/de/hackersoft/ariaagent/RvsClient.kt index fb4ca92..2755461 100644 --- a/host-agent/android/app/src/main/java/de/hackersoft/ariaagent/RvsClient.kt +++ b/host-agent/android/app/src/main/java/de/hackersoft/ariaagent/RvsClient.kt @@ -140,6 +140,11 @@ class RvsClient( action == "info" -> doInfo() action == "screenshot" -> doScreenshot() action == "ui_dump" -> doUiDump() + // Steuern geht nur bei ENTSPERRTEM Gerät (Gesten/Tasten greifen sonst + // nicht — Android-Sicherheit). Sehen (screenshot/ui_dump) geht gesperrt. + action in CONTROL_ACTIONS && isLocked() -> + err("Gerät ist gesperrt — zum Steuern bitte erst entsperren. " + + "(Screenshot/Bildschirm lesen geht auch gesperrt.)") action == "ui_tap" -> doUiTap(params) action == "ui_text" -> doUiText(params) action == "ui_swipe" -> doUiSwipe(params) @@ -158,6 +163,14 @@ class RvsClient( send(webSocket, "host_result", result) } + /** Steuer-Aktionen, die ein entsperrtes Gerät brauchen. */ + private val CONTROL_ACTIONS = setOf("ui_tap", "ui_text", "ui_swipe", "ui_key", "app_launch") + + private fun isLocked(): Boolean = try { + val km = appCtx.getSystemService(Context.KEYGUARD_SERVICE) as android.app.KeyguardManager + km.isKeyguardLocked + } catch (_: Exception) { false } + private fun err(m: String): JSONObject = JSONObject().put("ok", false).put("error", m) /** Bildschirmfoto — selber Vertrag wie der Desktop-Agent: {format,bytes,base64}. */