Чтение необработанных данных

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

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

Health Connect позволяет приложениям считывать данные из хранилища данных, когда приложение находится на переднем плане и в фоновом режиме:

  • Чтение на переднем плане : обычно вы можете читать данные из Health Connect, когда ваше приложение находится на переднем плане. В этих случаях вы можете рассмотреть возможность использования службы переднего плана для запуска этой операции на случай, если пользователь или система помещает ваше приложение в фоновый режим во время операции чтения.

  • Фоновое чтение . Запросив у пользователя дополнительное разрешение, вы можете читать данные после того, как пользователь или система поместит ваше приложение в фоновый режим. См. полный пример фонового чтения .

Тип данных «Шаги» в Health Connect фиксирует количество шагов, которые пользователь сделал между показаниями. Подсчет шагов представляет собой общее измерение на платформах здравоохранения, фитнеса и хорошего самочувствия. Health Connect упрощает чтение и запись данных о количестве шагов.

Чтобы прочитать записи, создайте ReadRecordsRequest и укажите его при вызове readRecords .

В следующем примере показано, как считать данные о количестве шагов пользователя за определенное время. Расширенный пример с SensorManager см. в руководстве по подсчету шагов .

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
    }
}

Пример фонового чтения

Чтобы читать данные в фоновом режиме, объявите следующее разрешение в файле манифеста:

<application>
  <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND" />
...
</application>

В следующем примере показано, как считывать данные о количестве шагов в фоновом режиме для пользователя в течение определенного времени с помощью WorkManager :

class ScheduleWorker(private val appContext: Context, workerParams: WorkerParameters):
    CoroutineWorker(appContext, workerParams) {

    override suspend fun doWork(): Result {
        // Read data and process it.
        ...

        // Return success indicating successful data retrieval
        return Result.success()
    }
}

if (healthConnectClient
    .features
    .getFeatureStatus(
    HealthConnectFeatures.FEATURE_READ_HEALTH_DATA_IN_BACKGROUND
    ) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE) {

    // Check if necessary permission is granted
    val grantedPermissions = healthConnectClient.permissionController.getGrantedPermissions()

    if (PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND !in grantedPermissions) {
        // Perform read in foreground
        ...
    } else {
        // Schedule the periodic work request in background
        val periodicWorkRequest = PeriodicWorkRequestBuilder<ScheduleWorker>(1, TimeUnit.HOURS)
            .build()

        WorkManager.getInstance(context).enqueueUniquePeriodicWork(
            "read_health_connect",
            ExistingPeriodicWorkPolicy.KEEP,
            periodicWorkRequest
        )
    }
} else {
  // Background reading is not available, perform read in foreground
  ...
}

Чтение ранее записанных данных

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

Чтобы прочитать данные в этом сценарии, вам необходимо указать имя пакета в качестве объекта DataOrigin в параметре dataOriginFilter вашего ReadRecordsRequest .

В следующем примере показано, как указать имя пакета при чтении записей шагов:

try {
    val response =  healthConnectClient.readRecords(
        ReadRecordsRequest(
            recordType = StepsRecord::class,
            timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
            dataOriginFilter = setOf(DataOrigin("com.my.package.name"))
        )
    )
    for (record in response.records) {
        // Process each record
    }
} catch (e: Exception) {
    // Run error handling here
}

30-дневное ограничение на чтение

Health Connect может считывать данные за 30 дней до момента первого предоставления разрешения.

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

Пример

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

Затем пользователь удаляет ваше приложение 10 мая 2023 г. Пользователь решает переустановить его 15 мая 2023 г. и предоставить разрешение на чтение. Самая ранняя дата, с которой ваше приложение теперь может считывать данные, — 15 апреля 2023 года .