Health Connect: разрешения, исходные записи и агрегаты без подмены отсутствующих данных нулём
Как Android разделяет доступ к данным, историческое чтение, запись измерений, источники и расчёт итоговых значений.

Платформа обмена, а не диагноз
Health Connect связывает клиентские приложения с локальным слоем данных через SDK и межпроцессное взаимодействие. Приложения могут записывать, читать и агрегировать поддерживаемые сведения, а пользователь управляет разрешениями через отдельный интерфейс платформы. Это технический канал обмена записями, а не медицинская интерпретация их значений.
В архитектуре различаются SDK, клиентское приложение, компонент Health Connect и средства управления данными и разрешениями. Наличие библиотеки в проекте не доказывает наличие работающей платформы на устройстве: доступность проверяется отдельно. Минимальные требования SDK и приложения Health Connect также различаются. Поэтому поддержка Android8 клиентским SDK не означает, что пользователь на Android8 автоматически получает возможности Health Connect. Приложение может продолжать работать без интеграции, если собственные функции не зависят от неё. Доступ к конкретным сведениям определяется отдельно для каждого приложения, а не выдаётся однажды всему установленному набору фитнес-сервисов.
Разрешения на чтение и запись независимы
Начиная с Android14 Health Connect является модулем Android Framework. Для более ранних поддерживаемых версий используется отдельное приложение. Перед созданием клиента проверяется статус SDK: недоступность компонента и отсутствие отдельных разрешений представляют разные состояния.
Разрешения объявляются для нужных типов данных, после чего запрашиваются у пользователя. Чтение StepsRecord и запись StepsRecord — отдельные возможности; аналогично разрешения на пульс не следуют автоматически из разрешений на шаги. Пользователь может изменить решение позднее, поэтому ранее успешный запрос не является постоянной гарантией доступа. В приложении требуется экран обоснования обработки данных и политика конфиденциальности, доступная из интерфейса разрешений. Наличие такого текста не заменяет сам системный запрос. Клиент HealthConnectClient управляет связью и сериализацией операций, но не может самостоятельно расширить выданные права только потому, что новая функция теперь присутствует в интерфейсе приложения.
Исходные записи приходят страницами
Чтение сырых данных возвращает записи заданного типа за выбранный промежуток. Результат может быть разбит на страницы; pageToken используется для продолжения. Один полученный ответ поэтому не обязательно содержит весь запрошенный период.
Документация отмечает различие некоторых реализаций: завершение пагинации может обозначаться не только null, но и пустой строкой. Проверка окончания учитывает оба варианта. Это особенность транспортного результата, а не пустой медицинский показатель. Отсутствие записей, отсутствие разрешения и неполное чтение списка нельзя превращать в одно состояние «измерено ноль». Для фонового чтения существует отдельное дополнительное разрешение пользователя, поэтому успешное чтение на открытом экране ещё не подтверждает возможность такой же операции после его закрытия.

История имеет отдельную границу доступа
По умолчанию разрешено чтение данных не ранее тридцати дней до первого предоставления разрешения. Для расширения исторического доступа запрашивается PERMISSION_READ_HEALTH_DATA_HISTORY. Это не скользящее обещание, что любое приложение всегда видит ровно последние тридцать дней: отправной точкой служит момент предоставления прав.
Удаление приложения отзывает разрешения, включая историческое. После переустановки и нового согласия применяются новые исходные ограничения. Следовательно, локальный экран «подключено» после повторной установки не доказывает восстановления прежнего объёма истории. Ограничение доступа не сообщает, что старые измерения уничтожены: приложение лишь не получает права прочитать их обычным запросом. Фактическое содержимое хранилища и разрешённый клиенту временной диапазон относятся к разным уровням платформы.
Запись описывает измерение, а не пустоту
У записей есть тип, время, значения и метаданные. StepsRecord описывает число шагов за интервал, а HeartRateRecord может содержать серию образцов со своими моментами времени. Единицы измерения также представлены явно: например, величины массы и энергии не следует смешивать только потому, что обе хранят числовое значение.
Особенно важно различать нулевую активность и отсутствующее наблюдение. Документация разрешает записывать ноль, когда устройство действительно носили и активности не было. Если устройство снято, выключилось либо данных недостаточно, отсутствие измерения не заменяется нулевой записью. Каждая запись получает идентификатор Health Connect; дополнительно приложение может задавать clientRecordId и clientRecordVersion для связи со своим хранилищем. Версия не увеличивается автоматически при каждом изменении. Это даёт приложению управляемую модель синхронизации, но требует согласовать, какой объект считается прежней записью, а какой новым наблюдением.
Итог за день — отдельный запрос
Агрегация принимает набор метрик и временной диапазон. Кумулятивные метрики дают сумму, статистические — минимум, максимум или среднее для поддерживаемых образцов. Можно фильтровать данные по источнику, например по приложению, которое записало сведения. Тогда результат описывает выбранную область, а не обязательно полный набор данных пользователя.
Группировка по Duration создаёт интервалы фиксированной длительности, а по Period — календарные периоды, например месяцы. Полученный список может быть разреженным: промежуток без данных не обязан присутствовать как строка с нулём. Это различие сохраняется при построении графика. Пропуск точки говорит об отсутствии результата для группы, тогда как нулевое значение является содержательным показателем. Набор запрошенных метрик тоже важен: ответ извлекается по конкретной метрике и может не содержать значения. Следовательно, красивый непрерывный график не является автоматическим свойством API; его форма зависит от того, как интерфейс представляет реальные пробелы и временные границы.
| Модель | Что описывает | Чем не является |
|---|---|---|
| Сырая запись | Измерение или интервал конкретного типа | Готовым итогом для любого графика |
| AggregateRequest | Метрики за выбранный диапазон | Полным списком исходных записей |
| Группировка по Duration | Интервалы фиксированной длительности | Автоматически календарным месяцем |
| Группировка по Period | Календарные периоды | Гарантией строки для периода без данных |
Источник: Android: aggregation and buckets
Пауза синхронизации и отзыв разрешений
Рекомендации интерфейса Health Connect различают переключатель синхронизации внутри приложения и управление разрешениями платформы. Выключенный переключатель означает остановку чтения и записи приложением. Это не обязательно тот же результат, что отзыв всех системных прав. Если приложение отзывает их программно, интерфейс Health Connect может отразить изменение не сразу без перезапуска; документация предлагает прямой переход к его настройкам.
При недостаточном доступе отображается соответствующее состояние, а не мнимое отсутствие активности. После двух последовательных отмен запроса пользователю показывается отдельный экран с переходом к настройкам разрешений. Эти схемы описывают управление интеграцией, а не оценку здоровья. В них существенно сохранить причину: платформа недоступна, доступ не выдан, синхронизация поставлена на паузу или записи действительно отсутствуют. Одинаковый пустой график для всех четырёх случаев скрыл бы технически разные состояния, каждое из которых имеет собственный способ изменения.



