Не удается накопить данные о частоте сердечных сокращений в Google Fit Api за последнюю неделю

#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!