Я постараюсь максимально упростить свой код, поскольку я использую специальные перечисления MealType и MealRelation, а затем перед сохранением правильно привожу их к эквиваленту здоровья Android.
/>Мой HealthConnectManager:
Код: Выделить всё
class HealthConnectManager(private val context: Context) {
val healthConnectClient by lazy { HealthConnectClient.getOrCreate(context) }
// Checking availability and permissions (they're all good)
suspend fun insertReading(glucose: Double, type: LocalMealType, relation: MealRelation) {
val record = BloodGlucoseRecord(
time = Instant.now(),
zoneOffset = ZoneOffset.UTC,
level = BloodGlucose.milligramsPerDeciliter(glucose),
metadata = Metadata.manualEntry(clientRecordId = UUID.randomUUID().toString()),
mealType = Utils.getSavableMealType(type),
relationToMeal = Utils.getSavableRelation(relation),
)
healthConnectClient.insertRecords(listOf(record))
}
suspend inline fun readData(
timeFilter: TimeRangeFilter,
dataOriginFilter: Set = setOf(),
): List {
val request = ReadRecordsRequest(
recordType = T::class,
dataOriginFilter = dataOriginFilter,
timeRangeFilter = timeFilter,
)
return healthConnectClient.readRecords(request).records
}
}
Код: Выделить всё
enum class LocalMealType {
Unknown, Breakfast, Lunch, Dinner, Snack
}
enum class MealRelation {
Fasting, Unknown, General, AfterMeal, BeforeMeal
}
object Utils {
fun getSavableMealType(type: LocalMealType): Int {
return when (type) {
LocalMealType.Unknown -> MealType.MEAL_TYPE_UNKNOWN
LocalMealType.Breakfast -> MealType.MEAL_TYPE_BREAKFAST
LocalMealType.Lunch -> MealType.MEAL_TYPE_LUNCH
LocalMealType.Dinner -> MealType.MEAL_TYPE_DINNER
LocalMealType.Snack -> MealType.MEAL_TYPE_SNACK
}
}
fun getSavableRelation(type: MealRelation): Int {
return when (type) {
MealRelation.Fasting -> RELATION_TO_MEAL_FASTING
MealRelation.Unknown -> RELATION_TO_MEAL_UNKNOWN
MealRelation.General -> RELATION_TO_MEAL_GENERAL
MealRelation.AfterMeal -> RELATION_TO_MEAL_AFTER_MEAL
MealRelation.BeforeMeal -> RELATION_TO_MEAL_BEFORE_MEAL
}
}
// I do the same for converting the entries to my enums
}
Итак, теперь в моей HomeViewModel я просто вызываю функцию менеджеров InsertReading и передаю ей значения. Я жестко запрограммировал значения в следующей части просто для простоты...
Код: Выделить всё
fun writeNewEntry(value: Double, type: LocalMealType, relation: MealRelation) {
viewModelScope.launch {
tryWithPermissionsCheck {
manager.insertReading(86.0, LocalMealType.Lunch, MealRelation.BeforeMeal)
}
}
}
Я добавил функцию ведения журнала в менеджере readData, чтобы увидеть показания до того, как пользовательский интерфейс получит их, и он показывает все правильно, за исключением уровня 0,0. Вот что я вижу в logcat
Что читаете?
Код: Выделить всё
BloodGlucoseRecord(time=2026-04-0tT22:05:15.759Z, zoneOffset=Z, level=0.0 mmol/L, mealType=2, relationToMeal=3, metadata=Metadata(id=...)
Я надеюсь, что это просто какая-то глупая ошибка, которую я совершаю, и кто-то сразу увидит, как я уже сказал, я не очень знаком с этим Android Health Connect и пытаюсь изучить его сейчас. Спасибо за любую помощь, я ценю это.