Pomiar temperatury skóry

Ten przewodnik jest zgodny z Health Connect w wersji 1.1.0-alpha12.

Health Connect udostępnia typ danych temperatura skóry do pomiaru temperatury obwodowej ciała. Ten pomiar jest szczególnie przydatny do wykrywania jakości snu, zdrowia reprodukcyjnego i potencjalnego początku choroby.

Sprawdzanie dostępności Health Connect

Zanim spróbujesz użyć Health Connect, Twoja aplikacja powinna sprawdzić, czy Health Connect jest dostępny na urządzeniu użytkownika. Health Connect może nie być wstępnie zainstalowany na wszystkich urządzeniach lub może być wyłączony. Dostępność możesz sprawdzić za pomocą metody HealthConnectClient.getSdkStatus().

Jak sprawdzić dostępność Health Connect

fun checkHealthConnectAvailability(context: Context) {
    val providerPackageName = "com.google.android.apps.healthdata" // Or get from HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME
    val availabilityStatus = HealthConnectClient.getSdkStatus(context, providerPackageName)

    if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE) {
      // Health Connect is not available. Guide the user to install/enable it.
      // For example, show a dialog.
      return // early return as there is no viable integration
    }
    if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED) {
      // Health Connect is available but requires an update.
      // 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
    }
    // Health Connect is available, obtain a HealthConnectClient instance
    val healthConnectClient = HealthConnectClient.getOrCreate(context)
    // Issue operations with healthConnectClient
}

W zależności od stanu zwróconego przez getSdkStatus() możesz w razie potrzeby poprosić użytkownika o zainstalowanie lub zaktualizowanie Health Connect ze Sklepu Google Play.

Dostępność funkcji

Aby sprawdzić, czy urządzenie użytkownika obsługuje temperaturę skóry w Health Connect, sprawdź dostępność FEATURE_SKIN_TEMPERATURE na kliencie:

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

  // Feature is available
} else {
  // Feature isn't available
}
Więcej informacji znajdziesz w artykule Sprawdzanie dostępności funkcji.

Wymagane uprawnienia

Dostęp do temperatury skóry jest chroniony przez te uprawnienia:

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

Aby dodać do aplikacji możliwość pomiaru temperatury skóry, zacznij od poproszenia o uprawnienia do typu danych SkinTemperature.

Aby móc zapisywać temperaturę skóry, musisz zadeklarować to uprawnienie:

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

Aby odczytać temperaturę skóry, musisz poprosić o te uprawnienia:

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

Prośba o uprawnienia od użytkownika

Po utworzeniu instancji klienta Twoja aplikacja musi poprosić użytkownika o uprawnienia. Użytkownicy muszą mieć możliwość przyznawania i odmawiania uprawnień w dowolnym momencie. Aby to zrobić, utwórz zbiór uprawnień dla wymaganych typów danych. Najpierw upewnij się, że uprawnienia w zbiorze są zadeklarowane w manifeście Androida.

val permissions =
    setOf(
        HealthPermission.getReadPermission(SkinTemperatureRecord::class),
        HealthPermission.getWritePermission(SkinTemperatureRecord::class)
    )
Użyj getGrantedPermissions , aby sprawdzić, czy Twoja aplikacja ma już wymagane uprawnienia. Jeśli nie, użyj createRequestPermissionResultContract aby poprosić o te uprawnienia. Spowoduje to wyświetlenie ekranu uprawnień Health Connect.
val permissions = setOf(
        HealthPermission.getReadPermission(StepsRecord::class),
        HealthPermission.getWritePermission(StepsRecord::class),
        HealthPermission.getReadPermission(HeartRateRecord::class),
        HealthPermission.getWritePermission(HeartRateRecord::class)
    )

val requestPermissionsLauncher = rememberLauncherForActivityResult(
    contract = PermissionController.createRequestPermissionResultContract()
) { grantedPermissions ->
    if (grantedPermissions.containsAll(permissions)) {
        coroutineScope.launch { snackbarHostState.showSnackbar("Permissions granted!") }
    } else {
        coroutineScope.launch { snackbarHostState.showSnackbar("Permissions denied.") }
    }
}
Użytkownicy mogą w dowolnym momencie przyznawać i cofać uprawnienia, dlatego Twoja aplikacja musi sprawdzać uprawnienia za każdym razem przed ich użyciem i obsługiwać sytuacje, w których uprawnienia zostaną utracone.

Informacje zawarte w rekordzie temperatury skóry

Pomiary temperatury skóry są uporządkowane w rekordy. Każdy rekord zawiera te informacje:

  • Temperatura bazowa w stopniach Celsjusza lub Fahrenheita. Jest to wartość opcjonalna, która jest najbardziej przydatna do wizualizacji w interfejsie aplikacji.
  • Lista różnic w temperaturze skóry, z których każda pokazuje zmianę temperatury skóry od ostatniego pomiaru. Jeśli podana jest temperatura bazowa, te różnice powinny używać tych samych jednostek temperatury.
  • Lokalizacja na ciele użytkownika, w której dokonano pomiaru: palec u ręki, palec u nogi lub nadgarstek.

Obsługiwane agregacje

Dla SkinTemperatureRecord dostępne są te wartości zagregowane:

Przykład użycia

Te fragmenty kodu pokazują, jak odczytywać i zapisywać pomiary temperatury skóry.

Odczytywanie rekordu temperatury skóry

Ten fragment kodu pokazuje, jak odczytać pomiary temperatury skóry za pomocą biblioteki 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.
    }
}

Zapisywanie rekordu temperatury skóry

Ten fragment kodu pokazuje, jak zapisywać pomiary temperatury skóry za pomocą biblioteki 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)
                ),
            )
        )
    )
}