Начните работу с Health Connect

В этом руководстве показано, как начать использовать Health Connect в своем приложении.

Шаг 1. Подготовьте приложение Health Connect.

Приложение Health Connect отвечает за обработку всех запросов, которые ваше приложение отправляет через Health Connect SDK. Эти запросы включают в себя хранение данных и управление доступом к ним для чтения и записи.

Доступ к Health Connect зависит от версии Android, установленной на телефоне. В следующих разделах описано, как работать с несколькими последними версиями Android.

Андроид 14

Начиная с Android 14 (уровень API 34), Health Connect является частью Android Framework. Эта версия Health Connect представляет собой модуль платформы . При этом нет необходимости в настройке.

Android 13 и более ранние версии

В Android 13 (уровень API 33) и более ранних версиях Health Connect не является частью Android Framework. Для этого вам необходимо установить приложение Health Connect из магазина Google Play.

Если вы интегрировали свое приложение с Health Connect на Android 13 и более ранних версиях и хотите перейти на Android 14, см. раздел «Миграция с Android 13 на Android 14» .

Откройте приложение Health Connect.

Health Connect больше не отображается на главном экране по умолчанию. Чтобы открыть Health Connect, перейдите в «Настройки» > «Приложения» > «Health Connect» или добавьте Health Connect в меню быстрых настроек .

Кроме того, Health Connect требует, чтобы у пользователя была включена блокировка экрана с помощью PIN-кода, шаблона или пароля, чтобы данные о состоянии здоровья, хранящиеся в Health Connect, были защищены от злоумышленников, пока устройство заблокировано. Чтобы установить блокировку экрана, выберите «Настройки» > «Безопасность» > «Блокировка экрана» .

Шаг 2. Добавьте Health Connect SDK в свое приложение.

Health Connect SDK отвечает за использование Health Connect API для отправки запросов при выполнении операций с хранилищем данных в приложении Health Connect.

Добавьте зависимость Health Connect SDK в файл build.gradle на уровне модуля:

dependencies {
  ...
  implementation "androidx.health.connect:connect-client:1.1.0-alpha02"
  ...
}

Для получения последней версии см. выпуски Health Connect .

Шаг 3. Настройте свое приложение

В следующих разделах объясняется, как настроить приложение для интеграции с Health Connect.

Объявить разрешения

Доступ к данным о здоровье и фитнесе является конфиденциальным. Health Connect реализует уровень безопасности для операций чтения и записи, поддерживая доверие пользователей.

Объявите разрешения на чтение и запись в файле AndroidManifest.xml на основе необходимых типов данных. Убедитесь, что вы используете тот набор разрешений, для которого вы запросили доступ после заполнения формы .

Health Connect использует стандартный формат декларации разрешений Android. Назначайте разрешения с помощью тегов <uses-permission> . Вложите их в теги <manifest> .

<manifest>
  <uses-permission android:name="android.permission.health.READ_HEART_RATE"/>
  <uses-permission android:name="android.permission.health.WRITE_HEART_RATE"/>
  <uses-permission android:name="android.permission.health.READ_STEPS"/>
  <uses-permission android:name="android.permission.health.WRITE_STEPS"/>

  <application>
  ...
  </application>
</manifest>

Полный список разрешений и соответствующих им типов данных см. в разделе Список типов данных .

Показать диалоговое окно политики конфиденциальности вашего приложения

В вашем манифесте Android должно быть действие, отображающее политику конфиденциальности вашего приложения, которая является обоснованием запрошенных разрешений вашего приложения и описывает, как используются и обрабатываются данные пользователя.

Объявите это действие для обработки намерения ACTION_SHOW_PERMISSIONS_RATIONALE , когда оно отправляется в приложение, когда пользователь нажимает ссылку на политику конфиденциальности на экране разрешений Health Connect.

...
<application>
  ...
  <!-- For supported versions through Android 13, create an activity to show the rationale
       of Health Connect permissions once users click the privacy policy link. -->
  <activity
      android:name=".PermissionsRationaleActivity"
      android:exported="true">
    <intent-filter>
      <action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" />
    </intent-filter>
  </activity>

  <!-- For versions starting Android 14, create an activity alias to show the rationale
       of Health Connect permissions once users click the privacy policy link. -->
  <activity-alias
      android:name="ViewPermissionUsageActivity"
      android:exported="true"
      android:targetActivity=".PermissionsRationaleActivity"
      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>
  ...
</application>
...

Получите клиент Health Connect

HealthConnectClient — это точка входа в API Health Connect. Это позволяет приложению использовать хранилище данных в приложении Health Connect. Он автоматически управляет подключением к базовому уровню хранения и обрабатывает все IPC и сериализацию исходящих запросов и входящих ответов.

Чтобы получить экземпляр клиента, сначала объявите имя пакета Health Connect в манифесте Android.

<application> ... </application>
...
<!-- Check if Health Connect is installed -->
<queries>
    <package android:name="com.google.android.apps.healthdata" />
</queries>

Затем в своем действии проверьте, установлено ли Health Connect с помощью getSdkStatus . Если да, получите экземпляр HealthConnectClient .

val availabilityStatus = HealthConnectClient.getSdkStatus(context, providerPackageName)
if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE) {
  return // early return as there is no viable integration
}
if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED) {
  // Optionally redirect to package installer to find a provider, for example:
  val uriString = "market://details?id=$providerPackageName&url=healthconnect%3A%2F%2Fonboarding"
  context.startActivity(
    Intent(Intent.ACTION_VIEW).apply {
      setPackage("com.android.vending")
      data = Uri.parse(uriString)
      putExtra("overlay", true)
      putExtra("callerId", context.packageName)
    }
  )
  return
}
val healthConnectClient = HealthConnectClient.getOrCreate(context)
// Issue operations with healthConnectClient

Шаг 4. Запросите разрешения у пользователя

После создания экземпляра клиента вашему приложению необходимо запросить разрешения у пользователя. Пользователям должно быть разрешено предоставлять или отказывать в разрешениях в любое время.

Для этого создайте набор разрешений для необходимых типов данных. Убедитесь, что разрешения в наборе сначала объявлены в манифесте Android.

// Create a set of permissions for required data types
val PERMISSIONS =
setOf(
  HealthPermission.getReadPermission(HeartRateRecord::class),
  HealthPermission.getWritePermission(HeartRateRecord::class),
  HealthPermission.getReadPermission(StepsRecord::class),
  HealthPermission.getWritePermission(StepsRecord::class)
)

Используйте getGrantedPermissions чтобы узнать, есть ли у вашего приложения необходимые разрешения. Если нет, используйте createRequestPermissionResultContract для запроса этих разрешений. Откроется экран разрешений Health Connect.

// Create the permissions launcher
val requestPermissionActivityContract = PermissionController.createRequestPermissionResultContract()

val requestPermissions = registerForActivityResult(requestPermissionActivityContract) { granted ->
  if (granted.containsAll(PERMISSIONS)) {
    // Permissions successfully granted
  } else {
    // Lack of required permissions
  }
}

suspend fun checkPermissionsAndRun(healthConnectClient: HealthConnectClient) {
  val granted = healthConnectClient.permissionController.getGrantedPermissions()
  if (granted.containsAll(PERMISSIONS)) {
    // Permissions already granted; proceed with inserting or reading data
  } else {
    requestPermissions.launch(PERMISSIONS)
  }
}

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

Шаг 5: Выполните операции

Теперь, когда все настроено, выполните операции чтения и записи в своем приложении.

Запись данных

Структурируйте свои данные в записи. Ознакомьтесь со списком типов данных, доступных в Health Connect.

val stepsRecord = StepsRecord(
    count = 120,
    startTime = START_TIME,
    endTime = END_TIME,
    startZoneOffset = START_ZONE_OFFSET,
    endZoneOffset = END_ZONE_OFFSET,
)

Затем напишите свою запись, используя insertRecords .

suspend fun insertSteps(healthConnectClient: HealthConnectClient) {
    try {
        val stepsRecord = StepsRecord(
            count = 120,
            startTime = START_TIME,
            endTime = END_TIME,
            startZoneOffset = START_ZONE_OFFSET,
            endZoneOffset = END_ZONE_OFFSET,
        )
        healthConnectClient.insertRecords(listOf(stepsRecord))
    } catch (e: Exception) {
        // Run error handling here
    }
}

Чтение данных

Вы можете прочитать свои данные по отдельности, используя readRecords .

suspend fun readStepsByTimeRange(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    try {
        val response =
            healthConnectClient.readRecords(
                ReadRecordsRequest(
                    StepsRecord::class,
                    timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
                )
            )
        for (stepRecord in response.records) {
            // Process each step record
        }
    } catch (e: Exception) {
        // Run error handling here.
    }
}

Вы также можете читать свои данные в агрегированном виде, aggregate .

suspend fun aggregateSteps(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    try {
        val response = healthConnectClient.aggregate(
            AggregateRequest(
                metrics = setOf(StepsRecord.COUNT_TOTAL),
                timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
            )
        )
        // The result may be null if no data is available in the time range
        val stepCount = response[StepsRecord.COUNT_TOTAL]
    } catch (e: Exception) {
        // Run error handling here
    }
}

Видеоуроки

Посмотрите эти видеоролики, которые объясняют больше о функциях Health Connect, а также дают рекомендации по обеспечению беспрепятственной интеграции:

Ресурсы

Ознакомьтесь со следующими ресурсами, которые помогут в дальнейшей разработке.

Следующие шаги

Ознакомьтесь с общими рабочими процессами , чтобы узнать, как выполнять в Health Connect такие операции, как: