- BrainTools - https://www.braintools.ru -
Превращаем смартфон в умного охранника с помощью Kotlin, CameraX, Gemini AI и Telegram
Прежде чем я начну рассказ о своем проекте, хочу выразить огромную благодарность всем тем бесчисленным программистам, разработчикам и энтузиастам, которые на протяжении многих лет делились своим кодом, знаниями и опытом [1] в интернете. Ваши открытые проекты, ответы на Stack Overflow, статьи, туториалы и обсуждения на форумах стали той самой питательной средой, на которой обучались большие языковые модели (LLM), включая и ту, что помогала мне. Без вашего вклада в общее дело такие мощные ИИ-ассистенты, которые сегодня так сильно облегчают и ускоряют разработку, были бы просто невозможны. Спасибо вам за то, что делаете мир разработки открытее и доступнее!
Исходный код проекта «Storog» полностью открыт и доступен на GitHub: storog.git [2]
Приглашаю всех желающих посмотреть, форкнуть и, возможно, предложить свои улучшения!
Все началось с простой мысли: у многих дома лежат старые или неиспользуемые Android-смартфоны. Почему бы не превратить один из них в умного “сторожа”? Представьте: вы уходите из дома и хотите быть в курсе, если что-то изменится в комнате — откроется дверь, появится домашний питомец в запретной зоне или, не дай бог, кто-то посторонний.
Основные возможности, которые я хотел реализовать:
Детекция визуальных изменений: Приложение следит за картинкой с камеры и сравнивает ее с эталонным изображением
Настраиваемая чувствительность: Пользователь сам решает, насколько сильное изменение считать “тревожным”
Интеллектуальный анализ: Если изменение зафиксировано, в дело вступает ИИ (Gemini 1.5 Flash), который анализирует изображение по заданному пользователем промпту
Telegram-уведомления: Фотография момента изменения и вердикт ИИ отправляются в указанный Telegram-чат
Простота использования: Понятный интерфейс с предпросмотром камеры и кнопками “Старт/Стоп”
Интерфейс приложения: превью камеры, настройки чувствительности и промпт для ИИ
Самое интересное в этой истории — весь код был написан ИИ-ассистентом (Gemini 2.5 Pro Preview в trae.ai [3]). Я выступал в роли продакт-менеджера, формулируя требования и тестируя результат.
1. Начало проекта Создал пустой проект в Android Studio (minSDK 26, Kotlin, Jetpack Compose) и дал ИИ изучить структуру.

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

3. Отладка разрешений Конечно, не все пошло гладко с первого раза:
🐛 Проблема: Нет изображения с камеры
🔍 Запрос к ИИ: “Нет изображения с камеры”
✅ Решение: ИИ нашел проблему — отсутствие разрешения в AndroidManifest.xml и добавил <uses-permission android:name="android.permission.CAMERA [4]" />
🐛 Следующая проблема: Изображение появлялось только после перезапуска приложения
🔍 Запрос: “Почему не отобразилось сразу изображение с камеры после включения доступа?”
✅ Решение: ИИ предложил использовать 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), ИИ предлагал код, я его интегрировал, тестировал, и если что-то шло не так — снова обращался к ИИ с описанием проблемы или логами ошибок.
На данный момент приложение умеет:
Отображать превью с камеры в реальном времени
Запускать и останавливать мониторинг одной кнопкой
Сравнивать текущий кадр с эталонным и показывать процент различия
Настраивать порог срабатывания (чувствительность от 0% до 100%)
Анализировать изображения через Gemini AI по пользовательскому промпту
Отправлять уведомления в Telegram с фото и результатом анализа
Фильтровать ложные срабатывания (не отправляет, если ответ ИИ начинается с «Нет»)
Хранить настройки между запусками приложения
Язык: Kotlin
UI: Jetpack Compose
Камера: CameraX
Асинхронность: Kotlin Coroutines
AI: Google Gemini API (com.google.ai [5].client.generativeai)
Сеть: Ktor Client (для Telegram API)
Хранение настроек: SharedPreferences
Скорость: Генерация кода для стандартных операций происходит очень быстро. То, что раньше заняло бы часы изучения документации, теперь решается за минуты.
Обучение [6]: ИИ часто предлагает решения, о которых я мог не знать или забыть. Это отличный способ изучать новые подходы и библиотеки.
Снижение рутины: Меньше времени тратится на написание бойлерплейта — разрешения, настройка CameraX, работа с SharedPreferences и т.д.
Помощь в отладке: ИИ неплохо справляется с анализом сообщений об ошибках и предлагает конкретные исправления.
Контекст: ИИ не всегда идеально понимает общий контекст проекта. Приходится дробить задачи и давать очень четкие, недвусмысленные запросы.
Не замена пониманию: ИИ — это инструмент. Чтобы эффективно им пользоваться и исправлять его ошибки [7], нужно самому разбираться в технологиях.
Итеративность: Редко когда ИИ выдает идеальное решение с первого раза. Обычно это диалог: запрос → код → тестирование → уточнение → исправленный код.
Будьте конкретны в запросах: Вместо “сделай камеру” лучше “добавь превью камеры в верхнюю треть экрана”
Разбивайте задачи: Лучше сделать 5 маленьких запросов, чем один большой
Всегда тестируйте код: ИИ может ошибаться, как и человек
Используйте контекст: Попросите ИИ изучить структуру вашего проекта
Не стесняйтесь переспрашивать: Если что-то непонятно, попросите объяснить решение
«Storog» — это пока прототип, но уже вполне рабочий. В планах:
Работа в фоновом режиме через Service
Расширенное планирование мониторинга (временные интервалы)
Создание «Storog» с помощью ИИ‑ассистента стало интересным и продуктивным опытом. Это не волшебная кнопка «сделать все за меня», а скорее очень мощный «парный программист», который может взять на себя рутину и помочь быстрее двигаться к цели.
Главный вывод: ИИ значительно снижает барьер входа в разработку и позволяет сосредоточиться на идее, а не на технических деталях реализации.
Если у вас есть старый Android‑смартфон и желание поэкспериментировать — попробуйте Storog! Исходный код полностью открыт: storog.git [2]
Буду рад вашим звездам ⭐, форкам 🍴 и предложениям по улучшению!
Что вы думаете о разработке с ИИ-ассистентами? Поделитесь своим опытом в комментариях!
Автор: kashyapov
Источник [8]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/15989
URLs in this post:
[1] опытом: http://www.braintools.ru/article/6952
[2] storog.git: https://github.com/premananda108/storog.git
[3] trae.ai: http://trae.ai
[4] android.permission.CAMERA: http://android.permission.CAMERA
[5] com.google.ai: http://com.google.ai
[6] Обучение: http://www.braintools.ru/article/5125
[7] ошибки: http://www.braintools.ru/article/4192
[8] Источник: https://habr.com/ru/articles/916598/?utm_source=habrahabr&utm_medium=rss&utm_campaign=916598
Нажмите здесь для печати.