Как получить показания о различных занятиях фитнесом с помощью Google Fit API? - PullRequest
0 голосов
/ 27 апреля 2018

В API Google Fit есть различные занятия фитнесом, такие как аэробика, бадминтон, бокс, поднятие тяжестей и т. Д. Как получить показания подсчитанных шагов и сожженных калорий для каждого из этих занятий с помощью Google Fit API? Любые предложения приветствуются. Заранее спасибо.

1 Ответ

0 голосов
/ 16 мая 2018

Я не уверен, нужен ли вам этот результат. Вы можете использовать bucketByActivitySegement в DataReadRequest.Builder для разделения каждого сегмента деятельности.

    DataReadRequest readRequest = new DataReadRequest.Builder()
            .aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA)
            .aggregate(DataType.TYPE_CALORIES_EXPENDED, DataType.AGGREGATE_CALORIES_EXPENDED)
            .bucketByActivitySegment( 1, TimeUnit.MINUTES) // just segement time over 1 minute will be list 
            .setTimeRange(startTimeLong, endTimeLong, TimeUnit.MILLISECONDS)
            .enableServerQueries()
            .build();

    Fitness.getHistoryClient(context, GoogleSignIn.getLastSignedInAccount(context))
           .readData(readRequest)
           .addOnSuccessListener()
           .addOnFailureListener();

В результате вы получите несколько сегментов, каждый сегмент представляет собой один сегмент активности. Ведро содержит два набора данных. Один - это шаг, другой - это калорийность. Просто так:

Bucket 0: activity: still, 05/09 00:00~08:03
-DataSet 0:  
--DataPoint 0: 05/09 08:02~09:03
---Field name: steps, value: 55
-DataSet 1: 
--DataPoint 0: 05/09 00:00~08:03
---Field name: calories, value: 459.41046

Bucket 1: acitvity: walking, 05/09 08:03~08:09
-DataSet 0:
--DataPoint 0: 05/09 08:03~08:04
---Field name: steps, value: 181
-DataSet: 1
--DataPoint 0: 05/09 08:03~08:09
---Field name: calories, value: 20.808548

Bucket 2: activity: in_vehicle, 05/09 08:09~08:48
-DataSet 0:
--DataPoint 0: 05/09 08:33~08:38
---Field name: steps, value: 156
-DataSet 1:
--DataPoint 0: 05/09 08:09~08:48
---Field name: calories, value: 36.633526

Bucket 3: activity: walking, 05/09 08:48~09:12
...
...
...

Если вам нужен результат, если в качестве совокупного значения для каждого типа в течение продолжительности можно использовать bucketByActivityType.

    DataReadRequest readRequest = new DataReadRequest.Builder()
            .aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA)
            .aggregate(DataType.TYPE_CALORIES_EXPENDED, DataType.AGGREGATE_CALORIES_EXPENDED)
            .bucketByActivityType( 1, TimeUnit.MINUTES)
            .setTimeRange(startTimeLong, endTimeLong, TimeUnit.MILLISECONDS)
            .enableServerQueries()
            .build();

Он вернет общее значение для каждого типа в течение вашего TimeRange.

Bucket 0: activity: still, 05/09 00:00 ~ 05/16 18:42
-DataSet 0:  
--DataPoint 0: 05/09 00:00 ~ 05/16 18:42
---Field name: calories, value: 9984.753
-DataSet 1: 
--DataPoint 0: 05/09 08:02 ~ 05/16 17:24
---Field name: steps, value: 6499

Bucket 1: acitvity: walking, 05/09 08:03 ~ 05/16 13:28
-DataSet 0:
--DataPoint 0: 05/09 08:03 ~ 05/16 13:28
---Field name: calories, value: 1214.7212
-DataSet: 1
--DataPoint 0: 05/09 08:03 ~ 05/16 13:20
---Field name: steps, value: 12750

Bucket 2: activity: in_vehicle, 05/09 08:09 ~ 05/09 08:48
-DataSet 0:
--DataPoint 0: 05/09 08:09 ~ 05/09 08:48
---Field name: calories, value: 36.633526
-DataSet 1:
--DataPoint 0: 05/09 08:33 ~ 05/09 08:38
---Field name: steps, value: 156

Bucket 3: activity: aerobics, 05/11 18:00 ~ 05/11 18:59
...
...
...

Надеюсь, это поможет вам.


--- обновление 2018/05/30 ---

В addOnSuccessListener() вы можете добавить прослушиватель следующим образом:

    new OnSuccessListener<DataReadResponse>() {
                @Override
                public void onSuccess(DataReadResponse dataReadResult) {
                    String returnValue = "";

                    if (dataReadResult.getBuckets().size() > 0) {
                        for (int i = 0; i < dataReadResult.getBuckets().size(); i++) {
                            returnValue += "\n\n" + i + " ---new bucket-- activity: " + dataReadResult.getBuckets().get(i).getActivity() + "\n"
                                    + getNoYearDateWithTimeFormat().format(dataReadResult.getBuckets().get(i).getStartTime(TimeUnit.MILLISECONDS)) + "~"
                                    + getNoYearDateWithTimeFormat().format(dataReadResult.getBuckets().get(i).getEndTime(TimeUnit.MILLISECONDS));

                            for (int j = 0; j < dataReadResult.getBuckets().get(i).getDataSets().size(); j++) {
                                returnValue += "\n-data set " + j + "-package: " + dataReadResult.getBuckets().get(i).getDataSets().get(j).getDataSource().getAppPackageName() + ", stream: " + dataReadResult.getBuckets().get(i).getDataSets().get(j).getDataSource().getStreamIdentifier();
                                returnValue += handleDailyRecordInDataSet(dataReadResult.getBuckets().get(i).getDataSets().get(j));
                            }
                        }
                    }


                    if (fitnessListener != null) {
                        fitnessListener.readActionDone(null, returnValue);
                    }
                }
            }

В каждом сегменте вы можете получить несколько DataSet для каждого типа данных.

private String handleDailyRecordInDataSet(DataSet dataSet) {
    String returnValue = "";

    for (DataPoint dataPoint : dataSet.getDataPoints()) {
        long startTime = dataPoint.getStartTime(TimeUnit.MILLISECONDS);
        long endTime = dataPoint.getEndTime(TimeUnit.MILLISECONDS);
        String tempValue = "DataPoint start: " + getDateWithTimeFormat().format(new Date(startTime))
                + ", end=" + getDateWithTimeFormat().format(new Date(endTime))
                + ", type=" + dataPoint.getDataType().getName() + ",  package=" + dataPoint.getDataSource().getAppPackageName() + ", stream=" + dataPoint.getDataSource().getStreamIdentifier();
        if (dataPoint.getDataSource().getDevice() != null) {
            tempValue += "\nManufacturer=" + dataPoint.getDataSource().getDevice().getManufacturer() + ", model=" + dataPoint.getDataSource().getDevice().getModel()
                    + ", uid: " + dataPoint.getDataSource().getDevice().getUid() + ", type=" + dataPoint.getDataSource().getDevice().getType();
        }
        tempValue += "\norigin source: package=" + dataPoint.getOriginalDataSource().getAppPackageName() + ", stream=" + dataPoint.getOriginalDataSource().getStreamIdentifier();
        if (dataPoint.getOriginalDataSource().getDevice() != null) {
            tempValue += "\nManufacturer=" + dataPoint.getOriginalDataSource().getDevice().getManufacturer() + ", model=" + dataPoint.getOriginalDataSource().getDevice().getModel()
                    + ", uid: " + dataPoint.getOriginalDataSource().getDevice().getUid() + ", type=" + dataPoint.getOriginalDataSource().getDevice().getType();
        }

        returnValue += ("\n\n" + tempValue);
        for (Field field : dataPoint.getDataType().getFields()) {
            String fieldValue = "Field name: " + field.getName() + ", value: " + dataPoint.getValue(field);

            returnValue += ("\n" + fieldValue);
        }
    }

    return returnValue;
}
...