1
0
forked from BRT/arc
arc/apk/arc-shot/README.md

2.5 KiB
Raw Permalink Blame History

arc-shot

Крошечное Android-приложение для фермы: foreground-сервис + HTTP-файл-сервер на порту 8099, раздающий скриншоты с /sdcard. Нужно, чтобы десктоп качал кадры по HTTP напрямую с телефона, мимо adb — иначе adb exec-out screencap по Wi-Fi виснет и душит adb-сервер (каскад adb devices timeout → mass-offline).

Экран приложение не снимает (это требовало бы MediaProjection с диалогом согласия) — кадр делает десктоп через adb shell screencap -p /sdcard/arc_shot.png, а arc-shot только отдаёт готовый файл по HTTP. Без внешних зависимостей (raw ServerSocket).

Эндпоинты

  • GET /health200 ok
  • GET /<file>.png → файл из /sdcard (например /arc_shot.png)

Сборка

Офлайн, без Gradle/AGP (только Android SDK build-tools):

./build_manual.sh
# -> build/arc-shot.apk

Переменные: BT_VER (build-tools, дефолт 35.0.1), PLATFORM (дефолт android-34), MIN_SDK/TARGET_SDK, ANDROID_SDK_ROOT.

Через Android Studio / Gradle — см. build.gradle. Важно: для AGP-сборки убрать атрибут package="com.arc.shot" из AndroidManifest.xml (AGP берёт пакет из namespace). Ручной build_manual.sh, наоборот, требует package= в манифесте.

Установка и выдача прав (с десктопа, через adb)

adb -s <serial> install -r build/arc-shot.apk
# доступ к /sdcard без диалога на устройстве:
adb -s <serial> shell appops set com.arc.shot MANAGE_EXTERNAL_STORAGE allow
# запустить сервис:
adb -s <serial> shell am start -n com.arc.shot/.MainActivity

Проверка

adb -s <serial> shell screencap -p /sdcard/arc_shot.png
IP=$(adb -s <serial> shell ip route get 1.1.1.1 | sed -n 's/.*src \([0-9.]*\).*/\1/p')
curl -s "http://$IP:8099/arc_shot.png" -o shot.png && file shot.png
curl -s "http://$IP:8099/health"   # -> ok

Десктоп использует этот путь автоматически при config.ini [screenshot] transport=http (с fallback на exec-out, если arc-shot недоступен).