Реализация трекинга калорий через мобильное приложение
Приложение для подсчёта калорий — это прежде всего база продуктов питания, надёжный алгоритм расчёта КБЖУ и интеграция с платформенными хранилищами данных здоровья. UX и ML для распознавания еды идут поверх этого фундамента.
База данных продуктов питания
Собственная база — трудоёмкий путь. Для старта используют готовые API:
Open Food Facts — открытая база с 3+ млн продуктов, REST API бесплатный:
GET https://world.openfoodfacts.org/api/v2/product/{barcode}.json
GET https://world.openfoodfacts.org/cgi/search.pl?search_terms=apple&json=true
Ответ содержит nutriments.energy-kcal_100g, nutriments.proteins_100g и т.д. Качество данных неоднородно: для глобальных брендов — отлично, для локальных продуктов — пропуски.
USDA FoodData Central — подробная нутриентная база США, бесплатный API с ключом:
GET https://api.nal.usda.gov/fdc/v1/foods/search?query=chicken+breast&api_key={key}
Для российского рынка — интеграция с базами типа «Состав продуктов» или собственная база с краудсорсингом.
Локальное кэширование: популярные продукты (топ-1000 по частоте поиска) кэшируются в Room/CoreData. Поиск по барcode или названию сначала в локальной базе, промах — запрос к API.
Сканирование штрихкода
Самый быстрый способ добавить продукт. На iOS — DataScannerViewController (iOS 16+, Vision framework под капотом) или AVCaptureMetadataOutput для более старых версий. На Android — CameraX + BarcodeScanning из ML Kit:
val options = BarcodeScannerOptions.Builder()
.setBarcodeFormats(Barcode.FORMAT_EAN_13, Barcode.FORMAT_EAN_8, Barcode.FORMAT_QR_CODE)
.build()
val scanner = BarcodeScanning.getClient(options)
val imageAnalysis = ImageAnalysis.Builder()
.setTargetResolution(Size(1280, 720))
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build()
imageAnalysis.setAnalyzer(executor) { imageProxy ->
val mediaImage = imageProxy.image ?: return@setAnalyzer imageProxy.close()
val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)
scanner.process(image)
.addOnSuccessListener { barcodes ->
barcodes.firstOrNull()?.rawValue?.let { barcode ->
onBarcodeDetected(barcode)
}
}
.addOnCompleteListener { imageProxy.close() }
}
Расчёт КБЖУ
Базовые формулы:
BMR (Mifflin-St Jeor):
- Мужчины:
10 × вес(кг) + 6.25 × рост(см) − 5 × возраст + 5 - Женщины:
10 × вес(кг) + 6.25 × рост(см) − 5 × возраст − 161
TDEE = BMR × коэффициент активности (1.2–1.9). Дефицит/профицит — целевые калории минус TDEE.
Суточная норма БЖУ в граммах: белок 1.6–2.2 г/кг веса (при похудении/наборе), жиры 0.8–1.2 г/кг, углеводы — остаток от общего КБЖУ.
Интеграция с HealthKit / Health Connect
iOS — запись калорий:
let calorieType = HKQuantityType(.dietaryEnergyConsumed)
let calorieSample = HKQuantitySample(
type: calorieType,
quantity: HKQuantity(unit: .kilocalorie(), doubleValue: 450),
start: mealTime,
end: mealTime
)
healthStore.save(calorieSample) { _, _ in }
Отдельно можно писать dietaryProtein, dietaryFatTotal, dietaryCarbohydrates — тогда данные появятся в разделе «Питание» в приложении «Здоровье».
Android — Health Connect:
val nutritionRecord = NutritionRecord(
startTime = mealTime,
startZoneOffset = ZoneOffset.systemDefault().getRules().getOffset(mealTime),
endTime = mealTime.plusMinutes(30),
endZoneOffset = ZoneOffset.systemDefault().getRules().getOffset(mealTime),
energy = Energy.kilocalories(450.0),
protein = Mass.grams(35.0),
totalCarbohydrate = Mass.grams(60.0),
totalFat = Mass.grams(15.0),
mealType = NutritionRecord.MEAL_TYPE_LUNCH
)
healthConnectClient.insertRecords(listOf(nutritionRecord))
Распознавание еды по фото (опционально)
ML Kit ImageLabeling на базе MobileNetV2 распознаёт ~1000 категорий объектов — не блюда, а объекты типа «apple», «sandwich». Для точного распознавания блюд нужна специализированная модель. Варианты:
- Logmeal API — REST API для распознавания еды, ~92% точности на стандартных блюдах
- Собственная модель на CoreML / TensorFlow Lite, обученная на датасете Food-101 или собственном
Сопоставление результата распознавания с базой продуктов — нечёткий поиск по имени категории.
Сроки
Базовое приложение с ручным вводом, сканером штрихкодов и интеграцией в HealthKit/Health Connect — 6–10 недель. С распознаванием еды по фото, синхронизацией с сервером и аналитикой — 3–5 месяцев.







