Health Connect будет поставляться вместе с Android 14 в качестве общего уровня хранения данных о здоровье и фитнесе потребителей, защищенного детализированными разрешениями и доступного как системное приложение Android (в этом документе именуемое «модулем платформы»).
Разработчикам следует рассмотреть возможность использования Health Connect APK (Android 13) в качестве уровня обратной совместимости для модели фреймворка. Модель фреймворка сохранит 100% функциональность своего предшественника в виде APK.
При переходе с Android 13 на 14 крайне важно, чтобы пользовательский интерфейс оставался максимально плавным и интуитивно понятным.
В этом документе излагается план миграции, приводятся некоторые примеры сценариев миграции и перечисляются изменения в Jetpack SDK, которые облегчают доступ к API Health Connect.
План миграции
- После выхода Android 14 Google переключится на предоставление Health Connect в качестве системного приложения Android.
- После достижения паритета функций данные будут загружены из APK.
- Все точки входа будут нацелены на пользовательский интерфейс системного приложения.
- Начнётся миграция данных. В ходе миграции API модуля будут приостановлены со статусом «Выполняется миграция». Это также будет отображаться в пользовательском интерфейсе Health Connect.
- После завершения миграции APK можно удалить.
Примеры сценариев миграции
Вот несколько примеров сценариев, поясняющих процесс миграции для interval
и series
типов данных:
Пример 1 — Бег (интервальные данные)
Пользователь собрал данные о беге по 1 часу каждый день за 10 лет. Это соответствует:
- Записи сеансов упражнений: 365 * 10 * 1
- Шаги: 365 * 10 * 1
- Калории: 365 * 10 * 1
- Итого = 365 * 10 * 3 (365 * 30) = 10 950
Учитывая, что 1 фрагмент равен 3000 записей, общее количество данных составляет около 4 фрагментов.
Наше внутреннее тестирование подтвердило, что вставка типичного фрагмента занимает около секунды, поэтому данные в примере будут перенесены примерно за 4 секунды.
Пример 2 — Частота сердечных сокращений (серийные данные)
Пользователь собрал данные о частоте сердечных сокращений за 5 лет (запись создается каждую минуту), что в общей сложности составляет 2 628 000 записей.
При 3000 записей в блоке данные распределены по 876 блокам. Учитывая, что вставка одного блока занимает около секунды, данные будут перенесены менее чем за 15 минут.
Предлагаемый миграционный поток
Мы решили выбрать мгновенную миграцию . На практике это означает, что APK-файл станет неактивным сразу после обновления устройства до Android 14, с минимальным вмешательством пользователя.
Вот общий поток миграции:
- Пользователь обновляет свое устройство до Android 14.
- Jetpack 14 направляет пользователя к API-интерфейсам модуля и блокирует их, пока выполняется миграция.
- Процесс миграции начинается, когда версия модуля становится функционально совместимой с APK, то есть версия модуля содержит тот же набор функций или больше. После начала процесса миграции APK переносит разрешения и данные.
- Если обе версии функционально несовместимы, необходимо обновить версию модуля. После завершения обновления начнётся процесс миграции.
- После завершения миграции состояние меняется на «Миграция завершена», а API модуля разблокируются.
- Теперь APK можно удалить.
Элементы интерфейса миграции
Следующие экраны отображаются модулем фреймворка в целях обучения пользователей как до, так и во время миграции:
Рисунок 1. Если APK-файл Health Connect не поддерживает миграцию, отображается запрос на обновление APK-файла. Если пользователь откажется от обновления, модуль продолжит работу и начнет накапливать разрешения и данные.

Рисунок 2. Если модулю фреймворка требуется обновление для обеспечения совместимости с функциями, отображается запрос на обновление и перезагрузку устройства. Если пользователь откажется от обновления, модуль продолжит работу и начнет накапливать разрешения и данные.

Рисунок 3. В процессе миграции отображается счетчик с текстом, поясняющим, что данные синхронизируются.

Дедуплицированные данные
Если модуль фреймворка начал получать данные и разрешения до того, как была выполнена какая-либо миграция или облачное восстановление, применяются следующие правила.
Разрешения
Если в модуле фреймворка присутствуют разрешения, любые дублирующие разрешения, полученные из APK, игнорируются в процессе миграции.
Данные
Во время миграции дублирующиеся данные из APK игнорируются. Приоритет отдаётся более свежим данным из модуля.
Данные дедуплицируются по clientRecordId
, если идентификатор записи предоставлен клиентом. В противном случае в качестве ключа рассматриваются временные интервалы ( startTime
и endTime
для внутренних записей и time
для мгновенных записей), а также тип данных и имя пакета приложения.
Изменения в Jetpack SDK
Jetpack SDK служит общей точкой интеграции как для Health Connect APK, так и для API фреймворка Health Connect.
OEM-производители могут начать интеграцию с Jetpack 13, чтобы, когда Jetpack 14 станет доступен, вы могли использовать новую библиотеку и скомпилировать ее в Android 14.
Мы выпустим новую версию SDK, которая поддерживает переход на Android 14. Вам потребуется внести некоторые изменения в существующую интеграцию, чтобы обеспечить плавный переход.
Декларация о разрешении
В Android 13 разрешения объявляются с использованием пользовательского формата разрешений в файле ресурсов, который связан с манифестом:
#AndroidManifest.xml
<activity>
android:name=".RationaleActivity"
android:exported="true">
<intent-filter>
<action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE"/>
</intent-filter>
<meta-data
android:name="health_permissions"
android:resource="@array/health_permissions"/>
</activity>
<queries>
<package android:name="com.google.android.apps.healthdata" />
</queries>
#health_permissions.xml
<resources>
<array name="health_permissions">
<item>androidx.health.permission.SleepSession.READ</item>
<item>androidx.health.permission.SleepStage.READ</item>
<item>androidx.health.permission.Weight.READ</item>
<item>androidx.health.permission.Weight.WRITE</item>
</array>
</resources>
Для поддержки Android 14 разработчикам необходимо перейти на стандартный формат разрешений:
#AndroidManifest.xml
<uses-permission android:name=”android.permission.health.READ_SLEEP” />
<uses-permission android:name=”android.permission.health.READ_WEIGHT” />
<uses-permission android:name=”android.permission.health.WRITE_WEIGHT” />
<activity>
android:name=".RationaleActivity"
android:exported="true">
<intent-filter>
<action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" />
</intent-filter>
</activity>
<queries>
<package android:name="com.google.android.apps.healthdata"/>
</queries>
Открытое здравоохранение Connect
В большинстве сторонних приложений есть кнопка, которая открывает приложение Health Connect, например кнопка «Управление доступом» в Fitbit.
В Android 13 приложение Health Connect открывается либо с помощью имени пакета, либо с помощью действия androidx.health.ACTION_HEALTH_CONNECT_SETTINGS
.
В Android 14 необходимо использовать действие намерения, указанное в Jetpack SDK, которое имеет разные значения в зависимости от версии Android, на которой оно выполняется:
@get:JvmName("getHealthConnectSettingsAction")
@JvmStatic val ACTION_HEALTH_CONNECT_SETTINGS
Получение клиента Health Connect
Мы создали единый API под названием sdkStatus
, доступный в Jetpack 11, для замены двух других устаревших API — IsSdkSupported()
и isProviderAvailable()
.
Изменения API записи сеанса
В рамках выпуска alpha10 были удалены четыре подтипа ExerciseSession
:
-
ExerciseEvent
-
ExerciseLaps
-
ExerciseRepetitions
-
SwimmingStrokes
Как и в случае с ExerciseSessionRecord
, SleepStage
станет подтипом SleepSession
.
Изменения подтипов ExerciseSessionRecord
и SleepSession
будут выпущены в рамках апрельского обновления SDK.
Обновление типа сеанса упражнений
Перечисленные ниже типы сеансов упражнений больше не будут поддерживаться и вместо этого будут добавлены как типы сегментов позднее:
-
EXERCISE_TYPE_BACK_EXTENSION
-
EXERCISE_TYPE_BARBELL_SHOULDER_PRESS
-
EXERCISE_TYPE_BENCH_PRESS
-
EXERCISE_TYPE_BENCH_SIT_UP
-
EXERCISE_TYPE_BURPEE
-
EXERCISE_TYPE_CRUNCH
-
EXERCISE_TYPE_DEADLIFT
-
EXERCISE_TYPE_DUMBBELL_CURL_LEFT_ARM
-
EXERCISE_TYPE_DUMBBELL_CURL_RIGHT_ARM
-
EXERCISE_TYPE_DUMBBELL_FRONT_RAISE
-
EXERCISE_TYPE_DUMBBELL_LATERAL_RAISE
-
EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM
-
EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM
-
EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_TWO_ARM
-
EXERCISE_TYPE_FORWARD_TWIST
-
EXERCISE_TYPE_JUMPING_JACK
-
EXERCISE_TYPE_JUMP_ROPE
-
EXERCISE_TYPE_LAT_PULL_DOWN
-
EXERCISE_TYPE_LUNGE
-
EXERCISE_TYPE_PLANK
-
EXERCISE_TYPE_SQUAT
-
EXERCISE_TYPE_UPPER_TWIST
Типы замены:
-
EXERCISE_TYPE_HIGH_INTENSITY_INTERVAL_TRAINING
-
EXERCISE_TYPE_STRENGTH_TRAINING
-
EXERCISE_TYPE_CALISTHENICS
Обработка журнала изменений
Журналы изменений не будут перенесены в ходе перехода с APK на Android 14.
После завершения миграции вы начнёте получать исключения TOKEN_EXPIRED
или TOKEN_INVALID
. Их следует обрабатывать следующими способами (в порядке приоритета):
1. Прочитайте и дедуплицируйте все данные с момента «последнего чтения» или за последние 30 дней.
Сохраните временную метку, указывающую, когда приложение последний раз считывало данные из Health Connect. По истечении срока действия токена данные необходимо повторно считать либо из этого значения, либо за предыдущие 30 дней (в зависимости от того, какой срок равен минимуму), и дедуплицировать их, сравнивая с ранее считанными данными, используя UUID.
2. Чтение данных с момента «последнего чтения»
Установите временную метку, указывающую, когда данные были последний раз прочитаны из Health Connect, и по истечении срока действия токена прочитайте все данные после этого значения.
3. Удалить и перечитать данные за последние 30 дней.
Удалите все данные, считанные из Health Connect за предыдущие 30 дней, и считайте все эти данные заново (например, как это делается при первой интеграции приложений с Health Connect).
4. Ничего не делать (т.е. перечитать данные за последние 30 дней и не выполнять дедупликацию)
Этот вариант следует использовать в крайнем случае, поскольку существует риск отображения дублирующихся данных. Разработчикам следует рассмотреть варианты 1–3, учитывая, что UUID уже должны быть заданы.
Тестирование API Android 14 с помощью Jetpack SDK
Выпуск Android 14 Jetpack SDK запланирован на 7 июня 2023 года одновременно с выпуском Beta 3 Android 14. Чтобы использовать Android 14 Jetpack SDK, вам потребуется начать компиляцию своего приложения для Android 14.
Если вы хотите протестировать свое решение на сборках Android Developer Preview до 7 июня, обратитесь за помощью к своему контактному лицу Google.
Если вы хотите протестировать свое решение на базе версии Beta 3, вам следует внести следующие изменения в ваш APK:
- Установите
compileSDKPreview = UpsideDownCake
. - Обновите манифест, включив в него намерение для Android 14:
# AndroidManifest.xml
<uses-permission android:name=”android.permission.health.READ_SLEEP”/>
<uses-permission android:name=”android.permission.health.READ_WEIGHT”/>
<uses-permission android:name=”android.permission.health.WRITE_WEIGHT”/>
<activity>
android:name=".RationaleActivity"
android:exported="true">
<intent-filter>
<action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE"/>
</intent-filter>
</activity>
<activity-alias>
android:name="AndroidURationaleActivity"
android:exported="true"
android:targetActivity=".RationaleActivity"
android:permission="android.permission.START_VIEW_PERMISSION_USAGE">
<intent-filter>
<action android:name="android.intent.action.VIEW_PERMISSION_USAGE" />
<category android:name="android.intent.category.HEALTH_PERMISSIONS" />
</intent-filter>
</activity-alias>
<queries>
<package android:name="com.google.android.apps.healthdata" />
</queries>
OEM-кастомизация
В Android 14 элементы управления конфиденциальностью и данными Health Connect находятся в системных настройках.
Чтобы экраны управления данными и разрешениями выглядели и воспринимались как часть устройства, Health Connect предлагает темы OEM с помощью пользовательских наложений.
Документацию по OEM-стилю см. в документации по Google Mobile Services для Health Connect . Для просмотра страницы может потребоваться войти в Google Developers.