Lettura di dati non elaborati

L'esempio seguente mostra come leggere i dati non elaborati nell'ambito del flusso di lavoro comune.

Lettura di dati

Connessione Salute consente alle app di leggere i dati dal data store quando l'app è attiva in primo piano e in background:

  • Letture in primo piano: in genere puoi leggere i dati da Connessione Salute quando la tua app è in primo piano. In questi casi, ti consigliamo di utilizzare un servizio in primo piano per eseguire questa operazione nel caso in cui l'utente o il sistema inserisca la tua app in background durante un'operazione di lettura.

  • Letture in background: richiedendo un'autorizzazione aggiuntiva all'utente, puoi leggere i dati dopo che l'utente o il sistema ha messo l'app in background. Consulta l'esempio completo di lettura in background.

Il tipo di dati Passaggi in Connessione Salute acquisisce il numero di passi compiuti da un utente tra una lettura e l'altra. Il conteggio dei passi rappresenta una misurazione comune su piattaforme per la salute, il fitness e il benessere. Connessione Salute semplifica la lettura e la scrittura dei dati relativi al conteggio dei passi.

Per leggere i record, crea un ReadRecordsRequest e forniscilo quando chiami readRecords.

L'esempio seguente mostra come leggere i dati relativi al numero di passi di un utente in un determinato periodo di tempo. Per un esempio dettagliato con SensorManager, consulta la guida ai dati sul conteggio dei passi.

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

Esempio di lettura in background

Per leggere i dati in background, dichiara la seguente autorizzazione nel file manifest:

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

L'esempio seguente mostra come leggere i dati relativi al numero di passi in background per un utente in un determinato periodo di tempo utilizzando 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
  ...
}

Leggere i dati scritti in precedenza

Se un'app ha già scritto record in Connessione Salute, è possibile che la stessa app li legga di nuovo senza richiedere l'autorizzazione di lettura per questi record specifici. Questo vale per gli scenari in cui l'app deve essere sincronizzata nuovamente con Connessione Salute dopo che l'utente l'ha reinstallata.

Per leggere i dati in questo scenario, devi indicare il nome del pacchetto come oggetto DataOrigin nel parametro dataOriginFilter del tuo ReadRecordsRequest.

L'esempio seguente mostra come indicare il nome di un pacchetto durante la lettura dei record Steps:

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
}

Restrizioni alla lettura

Per impostazione predefinita, la tua app può leggere i dati fino a 30 giorni con qualsiasi autorizzazione concessa. Con l'autorizzazione PERMISSION_READ_HEALTH_DATA_HISTORY, la tua app può leggere i dati precedenti a 30 giorni.

Limitazione di 30 giorni

Le applicazioni possono leggere i dati di Connessione Salute fino a 30 giorni prima della prima concessione di qualsiasi autorizzazione.

Tuttavia, se un utente elimina la tua app, la cronologia delle autorizzazioni viene persa. Se l'utente reinstalla la tua app e concede di nuovo l'autorizzazione, la tua app può leggere i dati di Connessione Salute fino a 30 giorni prima della nuova data.

Esempio di 30 giorni

Se un utente ha concesso per la prima volta l'autorizzazione di lettura alla tua applicazione il 30 marzo 2023, i dati più antichi che la tua app potrebbe leggere risalgono al 28 febbraio 2023.

L'utente elimina la tua app il 10 maggio 2023. L'utente decide di reinstallarlo il 15 maggio 2023 e concede l'autorizzazione di lettura. La data più recente a partire dalla quale la tua app può leggere i dati è il 15 aprile 2023.

Leggere i dati più vecchi di 30 giorni

Se vuoi leggere dati precedenti a 30 giorni, devi utilizzare l'autorizzazione PERMISSION_READ_HEALTH_DATA_HISTORY. Senza questa autorizzazione, un tentativo di lettura di un singolo record precedente a 30 giorni genera un errore. Inoltre, non puoi leggere i dati precedenti a 30 giorni utilizzando una delle richieste di intervallo di tempo.