Это руководство совместимо с Health Connect версии 1.1.0-alpha12 .
Health Connect предоставляет данные о температуре кожи для измерения периферической температуры тела. Это измерение особенно полезно для оценки качества сна, репродуктивного здоровья и выявления потенциальных заболеваний.
Проверьте доступность Health Connect
Прежде чем использовать Health Connect, ваше приложение должно проверить наличие Health Connect на устройстве пользователя. Health Connect может быть предустановлен не на всех устройствах или отключен. Проверить наличие Health Connect можно с помощью метода HealthConnectClient.getSdkStatus()
.
Как проверить доступность 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 }
В зависимости от статуса, возвращаемого getSdkStatus()
, вы можете предложить пользователю установить или обновить Health Connect из Google Play Store, если это необходимо.
Доступность функций
Чтобы определить, поддерживает ли устройство пользователя измерение температуры кожи в Health Connect, проверьте наличиеFEATURE_SKIN_TEMPERATURE
на клиенте:if (healthConnectClient
.features
.getFeatureStatus(
HealthConnectFeatures.FEATURE_SKIN_TEMPERATURE
) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE) {
// Feature is available
} else {
// Feature isn't available
}
Требуемые разрешения
Доступ к температуре кожи защищен следующими разрешениями:
-
android.permission.health.READ_SKIN_TEMPERATURE
-
android.permission.health.WRITE_SKIN_TEMPERATURE
Чтобы добавить в приложение возможность измерения температуры кожи, начните с запроса разрешений на запись для типа данных SkinTemperature
.
Вот разрешение, которое вам необходимо объявить, чтобы иметь возможность записывать температуру кожи:
<application>
<uses-permission
android:name="android.permission.health.WRITE_SKIN_TEMPERATURE" />
...
</application>
Для считывания температуры кожи вам необходимо запросить следующие разрешения:
<application>
<uses-permission
android:name="android.permission.health.READ_SKIN_TEMPERATURE" />
...
</application>
Запросить разрешения у пользователя
После создания клиентского экземпляра ваше приложение должно запрашивать разрешения у пользователя. Пользователи должны иметь возможность предоставлять или отклонять разрешения в любое время.
Для этого создайте набор разрешений для необходимых типов данных. Убедитесь, что разрешения в наборе предварительно объявлены в манифесте Android.
// Create a set of permissions for required data types
val PERMISSIONS =
setOf(
HealthPermission.getReadPermission(SkinTemperatureRecord::class),
HealthPermission.getWritePermission(SkinTemperatureRecord::class)
)
Используйте getGrantedPermissions
, чтобы проверить, предоставлены ли приложению необходимые разрешения. Если нет, запросите их с помощью createRequestPermissionResultContract
. Откроется экран разрешений Health Connect.
// 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)
}
}
Поскольку пользователи могут предоставлять или отзывать разрешения в любое время, ваше приложение должно периодически проверять наличие предоставленных разрешений и обрабатывать ситуации, когда разрешение теряется.
Информация, включенная в запись температуры кожи
Измерения температуры кожи организованы в записи . Каждая запись содержит следующую информацию:
- Базовая температура в градусах Цельсия или Фаренгейта. Это необязательное значение, которое удобно для визуализации в пользовательском интерфейсе вашего приложения.
- Список дельт температуры кожи, каждая из которых показывает изменение температуры кожи с момента последнего измерения. Если указана базовая температура, эти дельты должны быть выражены в тех же единицах измерения.
- Место на теле пользователя, где производилось измерение: палец руки, ноги или запястье.
Поддерживаемые агрегации
Для SkinTemperatureRecord
доступны следующие агрегированные значения:
Пример использования
В следующих фрагментах кода показано, как считывать и записывать результаты измерений температуры кожи.
Прочитать запись температуры кожи
Следующий фрагмент кода демонстрирует, как считывать измерения температуры кожи с помощью библиотеки 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.
}
}
Запишите запись температуры кожи
В следующем фрагменте кода показано, как записывать измерения температуры кожи с помощью библиотеки 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)
),
)
)
)
}