Превращаем смартфон в умного охранника с помощью Kotlin, CameraX, Gemini AI и Telegram

Привет, Хабр!

Прежде чем я начну рассказ о своем проекте, хочу выразить огромную благодарность всем тем бесчисленным программистам, разработчикам и энтузиастам, которые на протяжении многих лет делились своим кодом, знаниями и опытом в интернете. Ваши открытые проекты, ответы на Stack Overflow, статьи, туториалы и обсуждения на форумах стали той самой питательной средой, на которой обучались большие языковые модели (LLM), включая и ту, что помогала мне. Без вашего вклада в общее дело такие мощные ИИ-ассистенты, которые сегодня так сильно облегчают и ускоряют разработку, были бы просто невозможны. Спасибо вам за то, что делаете мир разработки открытее и доступнее!

Исходный код проекта «Storog» полностью открыт и доступен на GitHub: storog.git

Приглашаю всех желающих посмотреть, форкнуть и, возможно, предложить свои улучшения!

Идея: превратить смартфон в умного сторожа

Все началось с простой мысли: у многих дома лежат старые или неиспользуемые Android-смартфоны. Почему бы не превратить один из них в умного "сторожа"? Представьте: вы уходите из дома и хотите быть в курсе, если что-то изменится в комнате — откроется дверь, появится домашний питомец в запретной зоне или, не дай бог, кто-то посторонний.

Основные возможности, которые я хотел реализовать:

  • Детекция визуальных изменений: Приложение следит за картинкой с камеры и сравнивает ее с эталонным изображением

  • Настраиваемая чувствительность: Пользователь сам решает, насколько сильное изменение считать "тревожным"

  • Интеллектуальный анализ: Если изменение зафиксировано, в дело вступает ИИ (Gemini 1.5 Flash), который анализирует изображение по заданному пользователем промпту

  • Telegram-уведомления: Фотография момента изменения и вердикт ИИ отправляются в указанный Telegram-чат

  • Простота использования: Понятный интерфейс с предпросмотром камеры и кнопками "Старт/Стоп"

Интерфейс приложения: превью камеры, настройки чувствительности и промпт для ИИ

ИИ-ассистент в деле: от "Hello Android" до рабочего прототипа

Самое интересное в этой истории — весь код был написан ИИ-ассистентом (Gemini 2.5 Pro Preview в trae.ai). Я выступал в роли продакт-менеджера, формулируя требования и тестируя результат.

Процесс разработки выглядел так:

1. Начало проекта Создал пустой проект в Android Studio (minSDK 26, Kotlin, Jetpack Compose) и дал ИИ изучить структуру.

2. Первый функционал — отображение камеры

Мой запрос: "Нужно вывести изображение с камеры в MainActivity. 
Пусть это занимает верхнюю треть активити. 
Только работу с камерой реализуй в другом файле"

ИИ создалCameraHandler.kt и интегрировал его в MainActivity.

3. Отладка разрешений Конечно, не все пошло гладко с первого раза:

  • 🐛 Проблема: Нет изображения с камеры

  • 🔍 Запрос к ИИ: "Нет изображения с камеры"

  • ✅ Решение: ИИ нашел проблему — отсутствие разрешения в AndroidManifest.xml и добавил <uses-permission android:name="android.permission.CAMERA" />

  • 🐛 Следующая проблема: Изображение появлялось только после перезапуска приложения

  • 🔍 Запрос: "Почему не отобразилось сразу изображение с камеры после включения доступа?"

  • ✅ Решение: ИИ предложил использовать mutableStateOf на уровне класса MainActivity и обновлять его в колбэке registerForActivityResult

4. Добавление логики сравнения изображений

Запрос: "Добавь новый файл с функцией для сравнения двух изображений 
с камеры. Эта функция должна возвращать величину отличий в процентах"

Так появился ImageComparator.kt с функцией calculateDifferencePercentage():

suspend fun calculateDifferencePercentage(
    bitmap1: Bitmap,
    bitmap2: Bitmap,
    resizeWidth: Int? = 100, // Уменьшаем для скорости
    convertToGrayscale: Boolean = true
): Double = withContext(Dispatchers.Default) {
    try {
        val processedBitmap1: Bitmap
        val processedBitmap2: Bitmap
        
        if (resizeWidth != null) {
            val aspectRatio1 = bitmap1.height.toDouble() / bitmap1.width.toDouble()
            val resizeHeight1 = (resizeWidth * aspectRatio1).toInt()
            processedBitmap1 = Bitmap.createScaledBitmap(bitmap1, resizeWidth, resizeHeight1, true)
            // ... аналогично для bitmap2
        }
        // ... остальная логика сравнения
    } catch (e: Exception) {
        Log.e("ImageComparator", "Ошибка при сравнении изображений", e)
        0.0
    }
}

5. Реализация мониторинга

Запрос: "Добавь в MainActivity кнопку 'Старт', при нажатии нужно 
запомнить начальное изображение и потом каждые 5 секунд получать 
новое изображение и сравнивать его с начальным"

ИИ сгенерировал соответствующий код с использованием корутин (lifecycleScope.launch) и delay.

Дальше процесс шел итеративно: я описывал нужный функционал (настройки, ввод промпта для Gemini, отправка в Telegram), ИИ предлагал код, я его интегрировал, тестировал, и если что-то шло не так — снова обращался к ИИ с описанием проблемы или логами ошибок.

Что получилось: ключевые функции Storog

На данный момент приложение умеет:

  • Отображать превью с камеры в реальном времени

  • Запускать и останавливать мониторинг одной кнопкой

  • Сравнивать текущий кадр с эталонным и показывать процент различия

  • Настраивать порог срабатывания (чувствительность от 0% до 100%)

  • Анализировать изображения через Gemini AI по пользовательскому промпту

  • Отправлять уведомления в Telegram с фото и результатом анализа

  • Фильтровать ложные срабатывания (не отправляет, если ответ ИИ начинается с «Нет»)

  • Хранить настройки между запусками приложения

Технический стек

  • Язык: Kotlin

  • UI: Jetpack Compose

  • Камера: CameraX

  • Асинхронность: Kotlin Coroutines

  • AI: Google Gemini API (com.google.ai.client.generativeai)

  • Сеть: Ktor Client (для Telegram API)

  • Хранение настроек: SharedPreferences

Работа ИИ-ассистента: плюсы и подводные камни

🚀 Плюсы:

Скорость: Генерация кода для стандартных операций происходит очень быстро. То, что раньше заняло бы часы изучения документации, теперь решается за минуты.

Обучение: ИИ часто предлагает решения, о которых я мог не знать или забыть. Это отличный способ изучать новые подходы и библиотеки.

Снижение рутины: Меньше времени тратится на написание бойлерплейта — разрешения, настройка CameraX, работа с SharedPreferences и т.д.

Помощь в отладке: ИИ неплохо справляется с анализом сообщений об ошибках и предлагает конкретные исправления.

⚠️ Минусы и особенности:

Контекст: ИИ не всегда идеально понимает общий контекст проекта. Приходится дробить задачи и давать очень четкие, недвусмысленные запросы.

Не замена пониманию: ИИ — это инструмент. Чтобы эффективно им пользоваться и исправлять его ошибки, нужно самому разбираться в технологиях.

Итеративность: Редко когда ИИ выдает идеальное решение с первого раза. Обычно это диалог: запрос → код → тестирование → уточнение → исправленный код.

Практические советы по работе с ИИ в разработке

  1. Будьте конкретны в запросах: Вместо "сделай камеру" лучше "добавь превью камеры в верхнюю треть экрана"

  2. Разбивайте задачи: Лучше сделать 5 маленьких запросов, чем один большой

  3. Всегда тестируйте код: ИИ может ошибаться, как и человек

  4. Используйте контекст: Попросите ИИ изучить структуру вашего проекта

  5. Не стесняйтесь переспрашивать: Если что-то непонятно, попросите объяснить решение

Текущий статус и планы развития

«Storog» — это пока прототип, но уже вполне рабочий. В планах:

  • Работа в фоновом режиме через Service

  • Расширенное планирование мониторинга (временные интервалы)

Заключение

Создание «Storog» с помощью ИИ‑ассистента стало интересным и продуктивным опытом. Это не волшебная кнопка «сделать все за меня», а скорее очень мощный «парный программист», который может взять на себя рутину и помочь быстрее двигаться к цели.

Главный вывод: ИИ значительно снижает барьер входа в разработку и позволяет сосредоточиться на идее, а не на технических деталях реализации.

Если у вас есть старый Android‑смартфон и желание поэкспериментировать — попробуйте Storog! Исходный код полностью открыт: storog.git

Буду рад вашим звездам ⭐, форкам 🍴 и предложениям по улучшению!


Что вы думаете о разработке с ИИ-ассистентами? Поделитесь своим опытом в комментариях!