Количество шагов, полученных с помощью Google Fit Api, не соответствует количеству шагов, отображаемому в официальном приложении Google Fit

Я разработал приложение, которое должно отображать ежедневные подсчеты шагов. Для этого я использовал API, доступный в Google Fit SDK.

Кажется, что все работает правильно, но количество шагов, которое я получаю, не соответствует тому, которое отображается в Официальном приложении Google Fit.

Например, я получаю 2308 шагов, когда приложение Google Fit App отображает 2367 шагов.

Есть ли причина для этого? Кто-нибудь имеет такую ​​же проблему? У кого-нибудь есть ключ?

Ответ 1

Я нашел решение.

Приложение Fit выполняет некоторую дополнительную обработку поверх этих шагов. Он оценивает шаги, основанные на активности, когда никто не записывается.

Если это может помочь кому-то: Вам нужно использовать пользовательский DataSource пакета com.google.android.gms

DataSource ESTIMATED_STEP_DELTAS = new DataSource.Builder()
            .setDataType(DataType.TYPE_STEP_COUNT_DELTA)
            .setType(DataSource.TYPE_DERIVED)
            .setStreamName("estimated_steps")
            .setAppPackageName("com.google.android.gms")
            .build();

И используйте это в сводном методе следующим образом:

DataReadRequest readRequest = new DataReadRequest.Builder()
            .aggregate(ESTIMATED_STEP_DELTAS, DataType.AGGREGATE_STEP_COUNT_DELTA)
            .bucketByTime(1, TimeUnit.DAYS)
            .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
            .build();

Ответ 2

Google Play Services 7.3 (выпущена 28.04.2015) добавила новый метод HistoryApi.readDailyTotal, который соответствует количеству шагов на Google Fit официальное приложение и проще в использовании.

    PendingResult<DailyTotalResult> result = Fitness.HistoryApi.readDailyTotal(fitnessApiClient, DataType.AGGREGATE_STEP_COUNT_DELTA);
    DailyTotalResult totalResult = result.await(30, TimeUnit.SECONDS);
    if (totalResult.getStatus().isSuccess()) {
        DataSet totalSet = totalResult.getTotal();
        steps = totalSet.isEmpty() ? -1 : totalSet.getDataPoints().get(0).getValue(Field.FIELD_STEPS).asInt();
    }

Ответ 3

Как Sameer Z. спросил, что я отправляю полный код для получения значений.

DataSource estimatedSteps = new DataSource.Builder()
    .setDataType(DataType.TYPE_STEP_COUNT_DELTA)
    .setType(DataSource.TYPE_DERIVED)
    .setStreamName("estimated_steps")
    .setAppPackageName("com.google.android.gms")
    .build();

DataReadRequest readRequest = new DataReadRequest.Builder()
        .aggregate(estimatedSteps, DataType.AGGREGATE_STEP_COUNT_DELTA)
        .setTimeRange(startTimeSeconds, endTimeSeconds, TimeUnit.SECONDS)
        .bucketByTime(1, TimeUnit.DAYS)
        .enableServerQueries()
        .build();

PendingResult<DataReadResult> pendingResult = Fitness.HistoryApi.readData(client, readRequest);
pendingResult.setResultCallback(new ResultCallback<DataReadResult>() {
    @Override
    public void onResult(@NonNull DataReadResult dataReadResult) {
        List<Bucket> allBuckets = dataReadResult.getBuckets();

        for (Bucket bucket : allBuckets) {
            long startAtSeconds = bucket.getStartTime(TimeUnit.SECONDS);

            Value stepsValue = getValue(bucket, DataType.TYPE_STEP_COUNT_DELTA, Field.FIELD_STEPS);
            int steps = stepsValue != null ? stepsValue.asInt() : 0;

            Log.d(TAG, String.format("startAtSeconds %s, steps %s", startAtSeconds, steps));
        }
    }
});

Ответ 4

Google Fit sdk входит в состав сервисов Google Play. Официальное приложение Google Fit также собирает те же данные из sdk услуг Google Play, но Google, вероятно, добавил еще несколько кодов в приложение Google Fit, чтобы сделать данные более точный. Это также может быть ошибкой в ​​приложении Google Fit.