Додаток для обліку активності без інтеграції фітнес-платформи — втрата половини сценаріїв. Користувачі очікують автоматичний збір кроків, калорій, пульсу, але без Google Fit або Health Connect дані доводиться вводити вручну. Ми пропонуємо вбудувати Google Fit (і Health Connect як fallback) у ваш Android-додаток за 4–14 робочих днів — під ключ, з повною обробкою OAuth, дедуплікацією та підтримкою Wear OS. Наша команда має 5+ років досвіду в Android-розробці та понад 40 успішних проєктів з фітнес-інтеграцією.
Google Fit API існує з 2014 року і сьогодні перебуває в стані «працює, але краще мігрувати на Health Connect». Google офіційно рекомендує переходити на Health Connect для нових проєктів. Тим не менш, Google Fit залишається актуальним для пристроїв на Android 8–13 без підтримки Health Connect, для Wear OS-додатків та для проєктів з існуючою базою користувачів.
Google Fit REST API vs Fitness API
Дві принципово різні точки входу:
Android Fitness API (com.google.android.gms:play-services-fitness) — нативний Java/Kotlin SDK, працює через Google Play Services, потребує OAuth 2.0-акаунт Google.
Google Fit REST API — HTTP API, підходить для серверної сторони та Flutter/React Native, але потребує власного управління OAuth токенами.
Для нативного Android — завжди Fitness API. REST має сенс лише якщо дані потрібні на бекенді без участі мобільного пристрою.
Як ми інтегруємо Google Fit?
Ми використовуємо стек: Kotlin, Jetpack Compose, Hilt для DI, Google Sign-In для OAuth. На першому етапі аналізуємо вимоги до даних: які типи (кроки, пульс, калорії), чи потрібна агрегація за часом, чи потрібна підписка на живі дані. Потім проєктуємо архітектуру з урахуванням дедуплікації та обробки помилок. Реалізуємо читання історичних даних через HistoryClient і підписку через SensorsClient (для переднього плану) або RecordingClient (фоновий трекінг). Всі запити обгорнуті в suspend функції з корутинами для асинхронності.
Чому варто обирати Health Connect для нових проєктів?
Health Connect — це переосмислена платформа Google для обміну даними здоров'я між додатками. На відміну від Google Fit, вона не прив'язана до облікового запису Google, працює локально на пристрої та дає користувачеві більше контролю над тим, які додатки читають конкретні типи даних. Для Android 14+ вона доступна за замовчуванням, для старіших версій — через встановлення окремого APK.
| Характеристика | Google Fit | Health Connect |
|---|---|---|
| Залежність від акаунта Google | Так | Ні |
| Мінімальна версія Android | 8.0 | 8.0 (з APK) / 14+ (вбудований) |
| Дедуплікація | Часткова | Вбудована |
| Підтримка Wear OS | Так | Так |
| Рекомендація Google | Fallback | Основний стек |
Ми гарантуємо сумісність з обома підходами та допомагаємо клієнтам обрати стратегію міграції, оптимальну під їхню аудиторію.
Дозволи та OAuth: головне джерело проблем
Google Fit потребує двох рівнів дозволів:
- Android-дозвіл:
android.permission.ACTIVITY_RECOGNITION(з Android 10) - OAuth scope:
FITNESS_ACTIVITY_READ,FITNESS_BODY_READ,FITNESS_LOCATION_READтощо.
Якщо запросити Android-дозвіл, але не отримати OAuth scope — Fitness API поверне порожні дані без помилки. Це мовчазний збій, який важко відловити.
val fitnessOptions = FitnessOptions.builder() .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ) .addDataType(DataType.TYPE_HEART_RATE_BPM, FitnessOptions.ACCESS_READ) .build() val account = GoogleSignIn.getAccountForExtension(this, fitnessOptions) if (!GoogleSignIn.hasPermissions(account, fitnessOptions)) { GoogleSignIn.requestPermissions( this, GOOGLE_FIT_REQUEST_CODE, account, fitnessOptions ) } Якщо користувач відкликає дозвіл через налаштування Google-акаунта (не через Android Settings), hasPermissions() поверне false при наступному запуску. Це потрібно обробляти — без retry-логіки додаток просто перестане отримувати дані.
Читання даних: HistoryClient та SensorsClient
Історичні дані (кроки, калорії)
val readRequest = DataReadRequest.Builder() .read(DataType.TYPE_STEP_COUNT_DELTA) .aggregate(DataType.AGGREGATE_STEP_COUNT_DELTA) .bucketByTime(1, TimeUnit.DAYS) .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS) .build() Fitness.getHistoryClient(context, account) .readData(readRequest) .addOnSuccessListener { response -> response.buckets.forEach { bucket -> val steps = bucket.dataSets .flatMap { it.dataPoints } .sumOf { it.getValue(Field.FIELD_STEPS).asInt() } } } bucketByTime — ключовий метод для агрегації. Без нього запит поверне кожен окремий крок від кожного джерела (телефон + годинник + браслет), що може бути кілька тисяч записів за день.
Дані в реальному часі
SensorsClient для підписки на живі дані:
Fitness.getSensorsClient(context, account) .add(SensorRequest.Builder() .setDataType(DataType.TYPE_STEP_COUNT_CUMULATIVE) .setSamplingRate(10, TimeUnit.SECONDS) .build(), onDataPointListener ) Цей підписник активний лише поки додаток на передньому плані. Для фонового трекінгу — RecordingClient.subscribe(), який Google Fit акумулює сам.
Дедуплікація даних з кількох джерел
Це реальна біль: у користувача Apple Watch (через Health) + Google Fit на Android телефоні + Samsung Health — кроки подвоюються і потроюються. Google Fit частково вирішує це через DataSet.getDataSources() — у кожної точки даних є джерело (DataSource). Фільтрація за DataSource.DEVICE дозволяє брати дані лише від конкретного пристрою.
Повністю надійної дедуплікації немає — це відома проблема екосистеми. Документуємо клієнту очікувані розбіжності та будуємо UI так, щоб користувач міг обрати пріоритетне джерело.
Міграція на Health Connect
Для нових пристроїв (Android 14+) Google Fit deprecated на рівні рекомендацій. Стратегія: перевіряємо доступність Health Connect, якщо доступний — використовуємо його, fallback на Google Fit для старих пристроїв:
val healthConnectAvailable = HealthConnectClient.getSdkStatus(context) == HealthConnectClient.SDK_AVAILABLE Що входить в роботу
- Архітектурне проєктування: вибір підходу (Fitness API / REST / Health Connect)
- Реалізація OAuth-аутентифікації та обробка відкликання дозволів
- Розробка коду читання/запису даних (кроки, калорії, пульс тощо)
- Підтримка Wear OS за потреби
- Дедуплікація даних з кількох джерел
- Тестування на реальних пристроях з різними версіями Android
- Документація API та налаштувань OAuth
- Супровід при публікації в сторах (App Store Review Guidelines, Google Play Console)
Терміни
Базова інтеграція Google Fit (кроки, дистанція, калорії) — 4–7 робочих днів. З підтримкою Health Connect, дедуплікацією та Wear OS — 2–4 тижні. Зв'яжіться з нами для оцінки вашого проєкту — ми підберемо оптимальний підхід.
Google Fit API reference







