0

        long startDateInMS = dateUTCToMillisecs(startDate);
        long endDateInMS = dateUTCToMillisecs(endDate);

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

        WritableArray results = Arguments.createArray();
        DataSource DS = new DataSource.Builder()
                .setDataType(DataType.TYPE_HEART_RATE_BPM)
                .setType(DataSource.TYPE_DERIVED)
                .setStreamName("heart_rate")
                .setAppPackageName("com.google.android.gms")
                .build();

        final DataReadRequest req = new DataReadRequest.Builder()
                .aggregate(DS, DataType.AGGREGATE_HEART_RATE_SUMMARY)
                .bucketByTime(1, TimeUnit.DAYS)
                .setTimeRange(startDateInMS, endDateInMS, TimeUnit.MILLISECONDS)
                .build();


        GoogleSignInAccount googleSignInAccount = GoogleSignIn.getLastSignedInAccount(context);

        Fitness.getHistoryClient(context, googleSignInAccount).readData(req).addOnSuccessListener(new OnSuccessListener<DataReadResponse>() {
            @Override
            public void onSuccess(DataReadResponse dataReadResponse) {

            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
            }
        }).addOnCompleteListener(new OnCompleteListener<DataReadResponse>() {
            @Override
            public void onComplete(@NonNull Task<DataReadResponse> task) {

            }
        });

查询正在成功执行,但aggregated_heart_data即使我在 GoogleFit 应用中有心率值,数组也是空的

**我启用了 BODY_SENSORS 权限和位置权限 **

4

2 回答 2

0

我终于找到了一种聚合心率数据的方法(它适用于我的手机,但不适用于 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)
        }
    }
}

希望即使经过这么长时间我也能有所帮助。

于 2020-09-07T22:10:01.060 回答
0

看起来您设置的包名称不正确。它是数据提供者包名称。从您的数据请求中删除包名称。

您的数据请求源应如下所示

DataSource DS = new DataSource.Builder()
            .setDataType(DataType.TYPE_HEART_RATE_BPM)
            .setType(DataSource.TYPE_DERIVED)
            .build();
于 2020-01-15T21:31:09.930 回答