Импорт через Strava API (Android)¶
На Android Grom может импортировать недавние тренировки напрямую через Strava API, используя ваши credentials API-приложения Strava (bring-your-own / BYO). На сервер Grom ничего не сохраняется: Client ID, Client Secret и OAuth-токены остаются на устройстве. В веб-клиенте этот поток недоступен.
Для полной истории (или активностей старше окна синхронизации) используйте массовый импорт Strava (ZIP-архив).
Требования¶
- Аккаунт Strava с активной подпиской (Strava требует её для создания API-приложения).
- Создайте API-приложение на strava.com/settings/api.
- Скопируйте Client ID и Client Secret в Grom.
Если Connect падает с HTTP 403 на обмене токена, проверьте, что Client ID и Client Secret совпадают с API-приложением, и повторите попытку.
Новые приложения Strava стартуют в single-player режиме (авторизоваться может только владелец app) — это подходит для личного BYO.
Сценарий пользователя¶
- Откройте Интеграция → Внешние сервисы → Strava (только Android).
- Включите Импорт тренировок из Strava.
- Введите Client ID, Client Secret и при необходимости Тренировок за sync (по умолчанию 10, максимум 200).
- Нажмите Connect with Strava, выдайте scope
activity:readи убедитесь, что статус OK. - На Главной нажмите иконку синхронизации в app bar (как раньше у Health Sync).
- Grom покажет диалог «Синхронизация…», затем snackbar с числом импортированных тренировок (или что новых нет).
Выключение переключателя только прячет кнопку на Главной; credentials и токены остаются. Выход из Grom тоже их не очищает.
Правила синхронизации¶
| Правило | Поведение |
|---|---|
| Лимит | До настраиваемого числа Тренировок за sync (по умолчанию 10, максимум 200) последних активностей |
| Порядок | От новых к старым |
| Стоп | На первой активности, уже есть в Grom с external_id.name=strava и тем же id |
| Видимость | Только activity:read — Everyone / Followers (не «Only You») |
| Метрики | Дистанция, moving/elapsed time, скорости, высота, пульс, каденс, мощность и калории берутся из объекта активности Strava при наличии — не пересчитываются по треку |
| Streams | Запрашиваются все типы streams Strava (time, latlng, distance, altitude, velocity_smooth, heartrate, cadence, watts, temp, moving, grade_smooth); отсутствующие игнорируются |
| Трек | Всегда собирается FIT из streams, если есть хотя бы две полезные точки (сенсоры и/или GPS). Без валидного GPS position не пишется — indoor/силовые с пульсом всё равно получают трек. Пустые или полностью нулевые streams (например скорость) в FIT не пишутся, чтобы не создавать ненужные графики. Неполный GPS не подменяет метрики активности |
| Без streams | Workout по summary без трека (avg/max HR, cadence, watts, calories всё равно отправляются, если Strava их отдаёт) |
| Устройство | Берёт Strava device_name, если есть: пишется в FIT (product_name) и в поле create device (иначе дефолт сервера Grom App). В FIT не ставится manufacturer=development, поэтому тренировка не получает метку «Development» |
| Фото | Best-effort через photos API; ошибка фото не валит workout |
| Снаряжение | equipment_ids не передаётся → сервер берёт last_equipment_by_sport |
Уже импортированные активности sync не обновляет (удалите и импортируйте снова, если нужен исправленный трек).
Дедуп совпадает с ZIP-импортом (strava + id активности Strava).
Конфиденциальность¶
Client secret и refresh-токены хранятся в настройках приложения на устройстве. Grom не отправляет их на ваш инстанс.