Misurare la temperatura cutanea

Questa guida è compatibile con la versione 1.1.0-alpha12 di Connessione Salute.

Connessione Salute fornisce un tipo di dati temperatura cutanea per misurare la temperatura corporea periferica. Questa misurazione è un segnale particolarmente utile per rilevare la qualità del sonno, la salute riproduttiva e il potenziale insorgere di malattie.

Disponibilità della funzionalità

Per determinare se il dispositivo di un utente supporta la temperatura cutanea su Health Connect, controlla la disponibilità di FEATURE_SKIN_TEMPERATURE sul client:

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

  // Feature is available
} else {
  // Feature isn't available
}

Per saperne di più, consulta la sezione Verifica la disponibilità delle funzionalità.

Autorizzazioni richieste

L'accesso alla temperatura cutanea è protetto dalle seguenti autorizzazioni:

  • android.permission.health.READ_SKIN_TEMPERATURE
  • android.permission.health.WRITE_SKIN_TEMPERATURE

Per aggiungere la funzionalità di misurazione della temperatura cutanea alla tua app, inizia richiedendo le autorizzazioni di scrittura per il tipo di dati SkinTemperature.

Ecco l'autorizzazione che devi dichiarare per poter scrivere la temperatura cutanea:

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

Per leggere la temperatura cutanea, devi richiedere le seguenti autorizzazioni:

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

Richiedi le autorizzazioni all'utente

Dopo aver creato un'istanza client, la tua app deve richiedere le autorizzazioni all'utente. Gli utenti devono poter concedere o negare le autorizzazioni in qualsiasi momento.

A questo scopo, crea un insieme di autorizzazioni per i tipi di dati richiesti. Assicurati che le autorizzazioni nell'insieme siano dichiarate prima nel file manifest di Android.

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

Utilizza getGrantedPermissions per verificare se la tua app dispone già delle autorizzazioni richieste. In caso contrario, utilizza createRequestPermissionResultContract per richiedere queste autorizzazioni. Viene visualizzata la schermata delle autorizzazioni di Connessione Salute.

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

Poiché gli utenti possono concedere o revocare le autorizzazioni in qualsiasi momento, la tua app deve controllare periodicamente le autorizzazioni concesse e gestire gli scenari in cui l'autorizzazione viene revocata.

Informazioni incluse in un record della temperatura cutanea

Le misurazioni della temperatura cutanea sono organizzate in record. Ogni record è composto dalle seguenti informazioni:

  • Temperatura basale, in gradi Celsius o Fahrenheit. Si tratta di un valore facoltativo particolarmente utile per la visualizzazione nella UI della tua app.
  • Un elenco di variazioni della temperatura cutanea, ognuna delle quali mostra la variazione della temperatura cutanea rispetto all'ultima misurazione. Se viene fornita la temperatura basale, queste variazioni devono utilizzare le stesse unità di temperatura.
  • La posizione sul corpo dell'utente in cui è stata eseguita la misurazione: dito della mano, dito del piede o polso.

Aggregazioni supportate

Non sono presenti aggregazioni supportate per questo tipo di dati.

Esempio di utilizzo

Leggi o scrivi misurazioni della temperatura cutanea utilizzando la libreria JetPack.

Leggi la temperatura cutanea

Lo snippet di codice seguente mostra come leggere le misurazioni della temperatura cutanea utilizzando la libreria Jetpack:

suspend fun readSkinTemperatures() {
    // Error handling, permission check, and feature availability check
    // aren't included.

    // Record includes measurements during the past hour.
    val recordEndTime = Instant.now()
    val recordStartTime = recordEndTime.minusSeconds(60 * 60)

    val response = healthConnectClient.readRecords(
        ReadRecordsRequest<SkinTemperatureRecord>(
            timeRangeFilter = TimeRangeFilter.between(
                recordStartTime, recordEndTime
            )
        )
    )

    for (skinTemperatureRecord in response.records) {
        // Process each skin temperature record here.
    }
}

Scrivi la temperatura cutanea

Lo snippet di codice seguente mostra come scrivere le misurazioni della temperatura cutanea utilizzando la libreria Jetpack:


suspend fun writeSkinTemperatures(): InsertRecordsResponse {
    // Error handling, permission check, and feature availability check
    // aren't included.

    // Record includes measurements during the past hour.
    val recordEndTime: ZonedDateTime = now()
    val recordStartTime: ZonedDateTime = recordEndTime.minusHours(1)

    healthConnectClient.insertRecords(
        // For this example, there's only one skin temperature record.
        listOf(
            SkinTemperatureRecord(
                baseline = Temperature.celsius(37.0),
                startTime = recordStartTime.toInstant(),
                startZoneOffset = recordStartTime.offset,
                endTime = recordEndTime.toInstant(),
                endZoneOffset = recordEndTime.offset,
                deltas = listOf(
                    SkinTemperatureRecord.Delta(
                        recordEndTime.minusMinutes(50).toInstant(), celsius(0.5)
                    ), SkinTemperatureRecord.Delta(
                        recordEndTime.minusMinutes(30).toInstant(), celsius(-0.7)
                    )
                ),
                measurementLocation = SkinTemperatureRecord.MEASUREMENT_LOCATION_FINGER,
                metadata = Metadata.autoRecorded(
                    device = Device(type = Device.TYPE_RING)
                ),
            )
        )
    )
}