#java #android #kotlin #google-api #heartrate
#java #Android #kotlin #google-api #heartrate
Вопрос:
Я пытаюсь получить сводку частоты сердечных сокращений за одну неделю из Google Api, но я не получаю результата, только имя типа данных. Если я получаю данные только за определенный час, Api возвращает частоту сердечных сокращений, полученную из mi Mi Band 5, каждые 5 минут или около того. Если кто-нибудь может помочь, я был бы благодарен.
Функция построения:
private fun queryFitnessData2(): DataReadRequest {
// [START build_read_data_request]
// Setting a start and end date using a range of 1 week before this moment.
val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"))
val now = Date()
calendar.time = now
val endTime = calendar.timeInMillis
calendar.add(Calendar.WEEK_OF_YEAR, -1)
val startTime = calendar.timeInMillis
Log.i(TAG, "Range Start: ${dateFormat.format(startTime)}")
Log.i(TAG, "Range End: ${dateFormat.format(endTime)}")
return DataReadRequest.Builder()
.aggregate(DataType.TYPE_HEART_RATE_BPM, DataType.AGGREGATE_HEART_RATE_SUMMARY)
.enableServerQueries()
.bucketByTime(1, TimeUnit.DAYS)
.setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
.build();
}
Принтер данных:
private fun printData(dataReadResult: DataReadResponse) {
// [START parse_read_data_result]
// If the DataReadRequest object specified aggregated data, dataReadResult will be returned
// as buckets containing DataSets, instead of just DataSets.
if (dataReadResult.buckets.isNotEmpty()) {
Log.i(TAG, "Number of returned buckets of DataSets is: " dataReadResult.buckets.size)
for (bucket in dataReadResult.buckets) {
bucket.dataSets.forEach { dumpDataSet(it) }
}
} else if (dataReadResult.dataSets.isNotEmpty()) {
Log.i(TAG, "Number of returned DataSets is: " dataReadResult.dataSets.size)
dataReadResult.dataSets.forEach { dumpDataSet(it) }
}
// [END parse_read_data_result]
}
Функция синтаксического анализа набора данных:
// [START parse_dataset]
private fun dumpDataSet(dataSet: DataSet) {
Log.i(TAG, "Data returned for Data type: ${dataSet.dataType.name}")
val dateFormat: DateFormat = getTimeInstance()
//THIS IS WHERE THE FOR LOOP DOESN'T WORK!!
for (dp in dataSet.dataPoints) {
Log.i(TAG, "Data point:")
Log.i(TAG, "tType: ${dp.dataType.name}")
Log.i(TAG, "tStart: ${dp.getStartTimeString()}")
Log.i(TAG, "tEnd: ${dp.getEndTimeString()}")
dp.dataType.fields.forEach {
Log.i(TAG, "tField: ${it.name} Value: ${dp.getValue(it)}")
}
}
}
// [END parse_dataset]
Единственное, что регистрируется, — это тип данных, который является типом heart.rate.summary.
Цикл For не работает, если я использую корзины для каждого дня, но работает нормально, если я использую их для каждого часа дня. Любая помощь очень ценится.
Ответ №1:
Я наконец нашел способ агрегировать данные о частоте сердечных сокращений (это работает на моем телефоне, но не на эмуляторе Android Studio, так что имейте это в виду. Сначала добавьте тип данных для частоты сердечных сокращений и агрегированной частоты сердечных сокращений:
FitnessOptions fitnessOptions =
FitnessOptions.builder()
.addDataType(DataType.TYPE_HEART_RATE_BPM, FitnessOptions.ACCESS_WRITE)
.addDataType(DataType.AGGREGATE_HEART_RATE_SUMMARY,FitnessOptions.ACCESS_WRITE)
.build();
Затем выполните функцию FitnessQuery следующим образом:
private fun queryFitnessData2(): DataReadRequest {
// [START build_read_data_request]
// Setting a start and end date using a range of 1 week before this moment.
val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"))
val now = Date()
calendar.time = now
val endTime = calendar.timeInMillis
calendar.add(Calendar.WEEK_OF_YEAR, -1)
val startTime = calendar.timeInMillis
Log.i(TAG, "Range Start: ${dateFormat.format(startTime)}")
Log.i(TAG, "Range End: ${dateFormat.format(endTime)}")
return DataReadRequest.Builder()
.enableServerQueries()
.bucketByTime(1, TimeUnit.DAYS)
.setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
.aggregate(DataType.TYPE_HEART_RATE_BPM, DataType.AGGREGATE_HEART_RATE_SUMMARY)
.build();
}
И, наконец, дамп набора данных в сегментах, где каждый сегмент соответствует одному дню:
private fun printData(dataReadResult: DataReadResponse) {
// [START parse_read_data_result]
// If the DataReadRequest object specified aggregated data, dataReadResult will be returned
// as buckets containing DataSets, instead of just DataSets.
if (dataReadResult.buckets.isNotEmpty()) {
Log.i(TAG, "Number of returned buckets of DataSets is: " dataReadResult.buckets.size)
for (i in 0 until dataReadResult.buckets.size) {
for (j in 0 until dataReadResult.buckets[i].dataSets.size) {
dumpDataSet(dataReadResult.buckets[i].dataSets[j]);
}
}
} else if (dataReadResult.dataSets.isNotEmpty()) {
Log.i(TAG, "Number of returned DataSets is: " dataReadResult.dataSets.size)
dataReadResult.dataSets.forEach { dumpDataSet(it) }
}
// [END parse_read_data_result]
}
// [START parse_dataset]
private fun dumpDataSet(dataSet: DataSet) {
Log.i(TAG, "Data returned for Data type: ${dataSet.dataType.name}")
val dateFormat: DateFormat = getTimeInstance()
for (dp:DataPoint in dataSet.dataPoints) {
Log.i(TAG, "tStart: " dateFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS)));
Log.i(TAG, "tEnd: " dateFormat.format(dp.getEndTime(TimeUnit.MILLISECONDS)));
Log.i(TAG, "tType: " dp.dataType.name);
Log.i(TAG, "TEST")
for (field in dp.dataType.fields) {
Log.i(TAG, "TEST4")
val fieldValue = "Field name: " field.name.toString() ", value: " dp.getValue(field).asFloat();
Log.i(TAG, fieldValue)
}
}
}
Надеюсь, я помог кому-либо справиться с ужасной документацией Api Google!