Я пытаюсь интегрировать API-интерфейсы Google Health Connect в собственное приложение Android, написанное на Java, чтобы отслеживать количество шагов, однако у меня возникли проблемы. По какой-то причине мне трудно интегрировать все методы Google Health Connect, написанные на Kotlin, во фрагменты и действия проекта Java.
Я выполнил эти шаги. Начало работы с Health Connect, и я изменил код предоставлен Google, но все равно безуспешно.
Есть ли у кого-нибудь опыт интеграции этого нового API, предложенного Google, в приложение Android, написанное на Java?
На всякий случай вот мой код
HealthConnectManager (Kotlin)
import android.content.Context
import android.util.Log
import androidx.health.connect.client.HealthConnectClient
import androidx.health.connect.client.aggregate.AggregateMetric
import androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod
import androidx.health.connect.client.permission.HealthPermission
import androidx.health.connect.client.records.ExerciseSessionRecord
import androidx.health.connect.client.records.SleepSessionRecord
import androidx.health.connect.client.records.StepsRecord
import androidx.health.connect.client.request.AggregateGroupByPeriodRequest
import androidx.health.connect.client.time.TimeRangeFilter.Companion.between
import com.google.android.gms.fitness.data.DataType
import kotlinx.coroutines.CoroutineScope
import java.time.Duration.between
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime
import java.time.Period
import java.time.ZoneId
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.util.TimeZone
import kotlin.time.Duration
data class DataRecord(
val metricValue: String,
val dataType: DataType,
val fromDatetime: String,
val toDatetime: String
)
class HealthConnectManager(private val context: Context) {
private var healthConnectClient: HealthConnectClient? = null
val PERMISSIONS = setOf(
HealthPermission.getReadPermission(StepsRecord::class),
)
private val dateTimeFormatter: DateTimeFormatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX")
fun checkForHealthConnectInstalled(context: Context): Int {
val availabilityStatus =
HealthConnectClient.getSdkStatus(context, "com.google.android.apps.healthdata")
when (availabilityStatus) {
HealthConnectClient.SDK_UNAVAILABLE -> {
Log.w("HealthConnectUtils", "Health Connect SDK is unavailable on this device.")
}
HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED -> {
Log.w("HealthConnectUtils", "Health Connect SDK needs an update.")
}
HealthConnectClient.SDK_AVAILABLE -> {
Log.i("HealthConnectUtils", "Health Connect SDK is available.")
healthConnectClient = HealthConnectClient.getOrCreate(context)
}
}
return availabilityStatus
}
suspend fun checkPermissions(): Boolean {
val granted = healthConnectClient?.permissionController?.getGrantedPermissions()
return granted?.containsAll(PERMISSIONS) == true
}
suspend fun readStepsForInterval(interval: Long): List {
return readAggregateDataForInterval(interval, DataType.TYPE_STEP_COUNT_DELTA, StepsRecord.COUNT_TOTAL)
}
private suspend fun readAggregateDataForInterval(interval: Long, dataType: DataType, metric: AggregateMetric): List {
val startTime: ZonedDateTime = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).minusDays(interval - 1)
val endTime = LocalDateTime.now().atZone(TimeZone.getDefault().toZoneId()).minusMinutes(1).plusSeconds(59)
val response = healthConnectClient?.aggregateGroupByPeriod(
AggregateGroupByPeriodRequest(
metrics = setOf(metric),
timeRangeFilter = between(startTime.toLocalDate().atStartOfDay(), endTime.toLocalDateTime()),
timeRangeSlicer = Period.ofDays(1)
)
)
return parseAggregateResponse(response, startTime, endTime, dataType, metric)
}
private fun parseAggregateResponse(
response: List?,
startTime: ZonedDateTime,
endTime: ZonedDateTime,
dataType: DataType,
metric: AggregateMetric
): List {
val data = mutableListOf()
if (response != null) {
response.sortedBy { it.startTime }
var trackTime = startTime.toLocalDate().atStartOfDay()
for (dailyResult in response) {
if (dailyResult.startTime.isAfter(trackTime)) {
while (trackTime.isBefore(dailyResult.startTime)) {
data.add(
DataRecord(
metricValue = "No data",
dataType = dataType,
toDatetime = trackTime.toLocalDate().atTime(LocalTime.MAX)
.atZone(ZoneId.systemDefault()).format(dateTimeFormatter),
fromDatetime = if (trackTime.toLocalDate().isEqual(startTime.toLocalDate()))
startTime.format(dateTimeFormatter) else trackTime.atZone(ZoneId.systemDefault()).format(dateTimeFormatter)
)
)
trackTime = trackTime.plusDays(1)
}
}
val totalValue = dailyResult.result[metric]
data.add(
DataRecord(
metricValue = (totalValue ?: "No data").toString(),
dataType = dataType,
toDatetime = dailyResult.endTime.atZone(ZoneId.systemDefault()).minusSeconds(1).format(dateTimeFormatter),
fromDatetime = if (dailyResult.startTime.toLocalDate().isEqual(startTime.toLocalDate()))
startTime.format(dateTimeFormatter) else dailyResult.startTime.atZone(ZoneId.systemDefault()).format(dateTimeFormatter)
)
)
trackTime = dailyResult.endTime
}
while (trackTime.isBefore(endTime.toLocalDateTime()) && between(trackTime, endTime).toMinutes() > 1) {
data.add(
DataRecord(
metricValue = "No data",
dataType = dataType,
toDatetime = if (trackTime.toLocalDate().isEqual(endTime.toLocalDate()))
endTime.format(dateTimeFormatter) else trackTime.toLocalDate().atTime(LocalTime.MAX)
.atZone(ZoneId.systemDefault()).format(dateTimeFormatter),
fromDatetime = if (trackTime.toLocalDate().isEqual(startTime.toLocalDate()))
startTime.format(dateTimeFormatter) else trackTime.atZone(ZoneId.systemDefault()).format(dateTimeFormatter)
)
)
trackTime = trackTime.plusDays(1).toLocalDate().atStartOfDay()
}
}
Log.d("HealthConnectUtils", "Parsed Data: $data")
return data
}
suspend fun writeStepsData(context: Context, steps: Int, startTime: ZonedDateTime, endTime: ZonedDateTime) {
val stepsRecord = StepsRecord(
count = steps.toLong(),
startTime = startTime.toInstant(),
startZoneOffset = startTime.offset,
endTime = endTime.toInstant(),
endZoneOffset = endTime.offset
)
val response = healthConnectClient?.insertRecords(listOf(stepsRecord))
if (response != null) {
Log.d("HealthConnectUtils", "Steps data written successfully: $response")
} else {
Log.e("HealthConnectUtils", "Failed to write steps data.")
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... ect-issues
Интеграция Google Health Connect в проблемы проекта Java ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1721854180
Anonymous
Я пытаюсь интегрировать API-интерфейсы Google Health Connect в собственное приложение Android, написанное на Java, чтобы отслеживать количество шагов, однако у меня возникли проблемы. По какой-то причине мне трудно интегрировать все методы Google Health Connect, написанные на Kotlin, во фрагменты и действия проекта Java.
Я выполнил эти шаги. Начало работы с Health Connect, и я изменил код предоставлен Google, но все равно безуспешно.
Есть ли у кого-нибудь опыт интеграции этого нового API, предложенного Google, в приложение Android, написанное на Java?
На всякий случай вот мой код
HealthConnectManager (Kotlin)
import android.content.Context
import android.util.Log
import androidx.health.connect.client.HealthConnectClient
import androidx.health.connect.client.aggregate.AggregateMetric
import androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod
import androidx.health.connect.client.permission.HealthPermission
import androidx.health.connect.client.records.ExerciseSessionRecord
import androidx.health.connect.client.records.SleepSessionRecord
import androidx.health.connect.client.records.StepsRecord
import androidx.health.connect.client.request.AggregateGroupByPeriodRequest
import androidx.health.connect.client.time.TimeRangeFilter.Companion.between
import com.google.android.gms.fitness.data.DataType
import kotlinx.coroutines.CoroutineScope
import java.time.Duration.between
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime
import java.time.Period
import java.time.ZoneId
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.util.TimeZone
import kotlin.time.Duration
data class DataRecord(
val metricValue: String,
val dataType: DataType,
val fromDatetime: String,
val toDatetime: String
)
class HealthConnectManager(private val context: Context) {
private var healthConnectClient: HealthConnectClient? = null
val PERMISSIONS = setOf(
HealthPermission.getReadPermission(StepsRecord::class),
)
private val dateTimeFormatter: DateTimeFormatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX")
fun checkForHealthConnectInstalled(context: Context): Int {
val availabilityStatus =
HealthConnectClient.getSdkStatus(context, "com.google.android.apps.healthdata")
when (availabilityStatus) {
HealthConnectClient.SDK_UNAVAILABLE -> {
Log.w("HealthConnectUtils", "Health Connect SDK is unavailable on this device.")
}
HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED -> {
Log.w("HealthConnectUtils", "Health Connect SDK needs an update.")
}
HealthConnectClient.SDK_AVAILABLE -> {
Log.i("HealthConnectUtils", "Health Connect SDK is available.")
healthConnectClient = HealthConnectClient.getOrCreate(context)
}
}
return availabilityStatus
}
suspend fun checkPermissions(): Boolean {
val granted = healthConnectClient?.permissionController?.getGrantedPermissions()
return granted?.containsAll(PERMISSIONS) == true
}
suspend fun readStepsForInterval(interval: Long): List {
return readAggregateDataForInterval(interval, DataType.TYPE_STEP_COUNT_DELTA, StepsRecord.COUNT_TOTAL)
}
private suspend fun readAggregateDataForInterval(interval: Long, dataType: DataType, metric: AggregateMetric): List {
val startTime: ZonedDateTime = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).minusDays(interval - 1)
val endTime = LocalDateTime.now().atZone(TimeZone.getDefault().toZoneId()).minusMinutes(1).plusSeconds(59)
val response = healthConnectClient?.aggregateGroupByPeriod(
AggregateGroupByPeriodRequest(
metrics = setOf(metric),
timeRangeFilter = between(startTime.toLocalDate().atStartOfDay(), endTime.toLocalDateTime()),
timeRangeSlicer = Period.ofDays(1)
)
)
return parseAggregateResponse(response, startTime, endTime, dataType, metric)
}
private fun parseAggregateResponse(
response: List?,
startTime: ZonedDateTime,
endTime: ZonedDateTime,
dataType: DataType,
metric: AggregateMetric
): List {
val data = mutableListOf()
if (response != null) {
response.sortedBy { it.startTime }
var trackTime = startTime.toLocalDate().atStartOfDay()
for (dailyResult in response) {
if (dailyResult.startTime.isAfter(trackTime)) {
while (trackTime.isBefore(dailyResult.startTime)) {
data.add(
DataRecord(
metricValue = "No data",
dataType = dataType,
toDatetime = trackTime.toLocalDate().atTime(LocalTime.MAX)
.atZone(ZoneId.systemDefault()).format(dateTimeFormatter),
fromDatetime = if (trackTime.toLocalDate().isEqual(startTime.toLocalDate()))
startTime.format(dateTimeFormatter) else trackTime.atZone(ZoneId.systemDefault()).format(dateTimeFormatter)
)
)
trackTime = trackTime.plusDays(1)
}
}
val totalValue = dailyResult.result[metric]
data.add(
DataRecord(
metricValue = (totalValue ?: "No data").toString(),
dataType = dataType,
toDatetime = dailyResult.endTime.atZone(ZoneId.systemDefault()).minusSeconds(1).format(dateTimeFormatter),
fromDatetime = if (dailyResult.startTime.toLocalDate().isEqual(startTime.toLocalDate()))
startTime.format(dateTimeFormatter) else dailyResult.startTime.atZone(ZoneId.systemDefault()).format(dateTimeFormatter)
)
)
trackTime = dailyResult.endTime
}
while (trackTime.isBefore(endTime.toLocalDateTime()) && between(trackTime, endTime).toMinutes() > 1) {
data.add(
DataRecord(
metricValue = "No data",
dataType = dataType,
toDatetime = if (trackTime.toLocalDate().isEqual(endTime.toLocalDate()))
endTime.format(dateTimeFormatter) else trackTime.toLocalDate().atTime(LocalTime.MAX)
.atZone(ZoneId.systemDefault()).format(dateTimeFormatter),
fromDatetime = if (trackTime.toLocalDate().isEqual(startTime.toLocalDate()))
startTime.format(dateTimeFormatter) else trackTime.atZone(ZoneId.systemDefault()).format(dateTimeFormatter)
)
)
trackTime = trackTime.plusDays(1).toLocalDate().atStartOfDay()
}
}
Log.d("HealthConnectUtils", "Parsed Data: $data")
return data
}
suspend fun writeStepsData(context: Context, steps: Int, startTime: ZonedDateTime, endTime: ZonedDateTime) {
val stepsRecord = StepsRecord(
count = steps.toLong(),
startTime = startTime.toInstant(),
startZoneOffset = startTime.offset,
endTime = endTime.toInstant(),
endZoneOffset = endTime.offset
)
val response = healthConnectClient?.insertRecords(listOf(stepsRecord))
if (response != null) {
Log.d("HealthConnectUtils", "Steps data written successfully: $response")
} else {
Log.e("HealthConnectUtils", "Failed to write steps data.")
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78790528/google-health-connect-integration-in-java-project-issues[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия