【问题标题】:Cannot accumulate heart rate data in Google Fit Api for the past week无法在 Google Fit Api 中累积过去一周的心率数据
【发布时间】:2020-09-06 15:35:44
【问题描述】:

我很想从 Google Api 获取一周的心率摘要,但我只得到数据类型名称的结果。如果我只抓取特定小时,Api 每 5 分钟左右返回从 mi Mi Band 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 循环不起作用,但如果我每天每小时都使用它们,则效果很好。非常感谢任何帮助。

【问题讨论】:

    标签: java android kotlin google-api heartrate


    【解决方案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)
            }
        }
    }
    

    希望我能帮助任何在 Google 可怕的 Api 文档中苦苦挣扎的人!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多