Как ИИ помог создать систему видеонаблюдения на Android
Превращаем смартфон в умного охранника с помощью 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 и т.д.
Помощь в отладке: ИИ неплохо справляется с анализом сообщений об ошибках и предлагает конкретные исправления.
⚠️ Минусы и особенности:
Контекст: ИИ не всегда идеально понимает общий контекст проекта. Приходится дробить задачи и давать очень четкие, недвусмысленные запросы.
Не замена пониманию: ИИ — это инструмент. Чтобы эффективно им пользоваться и исправлять его ошибки, нужно самому разбираться в технологиях.
Итеративность: Редко когда ИИ выдает идеальное решение с первого раза. Обычно это диалог: запрос → код → тестирование → уточнение → исправленный код.
Практические советы по работе с ИИ в разработке
Будьте конкретны в запросах: Вместо "сделай камеру" лучше "добавь превью камеры в верхнюю треть экрана"
Разбивайте задачи: Лучше сделать 5 маленьких запросов, чем один большой
Всегда тестируйте код: ИИ может ошибаться, как и человек
Используйте контекст: Попросите ИИ изучить структуру вашего проекта
Не стесняйтесь переспрашивать: Если что-то непонятно, попросите объяснить решение
Текущий статус и планы развития
«Storog» — это пока прототип, но уже вполне рабочий. В планах:
Работа в фоновом режиме через Service
Расширенное планирование мониторинга (временные интервалы)
Заключение
Создание «Storog» с помощью ИИ‑ассистента стало интересным и продуктивным опытом. Это не волшебная кнопка «сделать все за меня», а скорее очень мощный «парный программист», который может взять на себя рутину и помочь быстрее двигаться к цели.
Главный вывод: ИИ значительно снижает барьер входа в разработку и позволяет сосредоточиться на идее, а не на технических деталях реализации.
Если у вас есть старый Android‑смартфон и желание поэкспериментировать — попробуйте Storog! Исходный код полностью открыт: storog.git
Буду рад вашим звездам ⭐, форкам 🍴 и предложениям по улучшению!
Что вы думаете о разработке с ИИ-ассистентами? Поделитесь своим опытом в комментариях!