Ler dados brutos

O exemplo abaixo mostra como ler dados brutos do fluxo de trabalho comum.

Ler dados

A Conexão Saúde permite que os apps leiam dados do repositório de dados quando estão em primeiro e segundo plano:

  • Leituras em primeiro plano: normalmente é possível ler dados da Conexão Saúde quando o app está em primeiro plano. Nesses casos, use um serviço em primeiro plano para executar essa operação caso o usuário ou o sistema coloque o app em segundo plano durante uma operação de leitura.

  • Leituras em segundo plano: ao solicitar uma permissão extra do usuário, você pode ler dados depois que o usuário ou o sistema colocar o app em segundo plano. Veja o exemplo de leitura em segundo plano completo.

O tipo de dados "passos" no Conexão Saúde captura o número de passos que um usuário deu entre as leituras. A contagem de passos representa uma medida comum nas plataformas de saúde, condicionamento físico e bem-estar. A Conexão Saúde simplifica a leitura e a gravação de dados de contagem de passos.

Para ler registros, crie uma ReadRecordsRequest e forneça quando você chamar readRecords.

O exemplo abaixo mostra como ler dados de contagem de passos de um usuário em um determinado período. Para conferir um exemplo mais detalhado com SensorManager, consulte o guia de dados de contagem de passos.

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

Exemplo de leitura em segundo plano

Para ler dados em segundo plano, declare a seguinte permissão no arquivo de manifesto:

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

O exemplo abaixo mostra como ler dados de contagem de passos em segundo plano de um usuário em um determinado período usando 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
  ...
}

Ler dados gravados anteriormente

Se um app tiver gravado registros na Conexão Saúde antes, ele poderá ler esses registros de novo sem precisar de uma permissão de leitura para esses registros específicos. Isso se aplica a cenários em que o app precisa ser sincronizado novamente com a Conexão Saúde depois que o usuário o reinstala.

Para ler os dados nesse cenário, é necessário indicar o nome do pacote como um objeto DataOrigin no parâmetro dataOriginFilter da ReadRecordsRequest.

O exemplo abaixo mostra como indicar o nome de um pacote ao ler os registros de passos:

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
}

Restrições de leitura

Por padrão, o app pode ler dados de até 30 dias com todas as permissões concedidas. Com a permissão PERMISSION_READ_HEALTH_DATA_HISTORY, seu app pode ler dados com mais de 30 dias.

Restrição de 30 dias

A Conexão Saúde pode ler dados registrados até 30 dias antes de uma permissão ser concedida.

No entanto, se um usuário excluir seu app, o histórico de permissões será perdido. Se o usuário reinstalar o app e conceder a permissão novamente, ele poderá ler dados da Conexão Saúde registrados até 30 dias antes dessa nova data.

Exemplo de 30 dias

Se um usuário concedeu permissão de leitura ao seu app pela primeira vez em 30 de março de 2023, os dados mais antigos que ele poderá ler serão de 28 de fevereiro de 2023 em diante.

Em seguida, o usuário exclui seu app em 10 de maio de 2023. O usuário decide reinstalá-lo em 15 de maio de 2023 e conceder permissão de leitura. A data mais antiga de que o app poderá ler dados será 15 de abril de 2023.

Ler dados com mais de 30 dias

Se você quiser ler dados com mais de 30 dias, use a permissão PERMISSION_READ_HEALTH_DATA_HISTORY. Sem essa permissão, a tentativa de ler um único registro com mais de 30 dias resulta em erro. Também não é possível ler dados com mais de 30 dias usando uma das solicitações de período.