Почему количество шагов в Google Fit различается

Я использовал Sensor API для подсчета шагов. Я видел, что это отличается от приложения Google Fit. Использует ли приложение Google Fit другие функции Sensor API?

Фрагмент кода:

Fitness.SensorsApi.add(
            mGoogleApiFitnessClient,
            new SensorRequest.Builder()
                    .setDataType(DataType.TYPE_STEP_COUNT_DELTA) 
                    .setSamplingRate(5, TimeUnit.SECONDS)
                    .build(),
            mListener)
            .setResultCallback(new ResultCallback<Status>() {
                @Override
                public void onResult(Status status) {
                    if (status.isSuccess()) {
                        Log.i(TAG, "Listener registered!");
                    } else {
                        Log.i(TAG, "Listener not registered.");
                    }
                }
            });

Результат подсчета шагов

Мое приложение: 2484

Google Fit: 4636

Я что-то пропустил???


person Sayem    schedule 14.01.2016    source источник
comment
Возможно, ваше приложение получает количество шагов, например. ваши часы и Google Fit объединяют количество шагов из любых источников (например, часы + мобильный телефон). Просто дикая догадка.   -  person dipdipdip    schedule 14.01.2016
comment
Что произойдет, если вы уменьшите частоту дискретизации, скажем, до одной секунды?   -  person iaindownie    schedule 14.01.2016
comment
@iaindownie Я думаю, что это не влияет на результат подсчета. разработчики. google.com/android/reference/com/google/android/gms/, java.util.concurrent.TimeUnit)   -  person Sayem    schedule 14.01.2016


Ответы (2)


Если вы используете метод Fitness.HistoryApi.readData(), ваши значения будут соответствовать или, по крайней мере, будут очень близки к тому, что отображается в Google Fit. То, что вы видите в приложении Google Fit, — это данные истории. Под историей я подразумеваю историю до последнего обновления облачного хранилища Google для данных о фитнесе. Это могло быть всего минуту назад. Судя по всему, Google Fit загружает данные о здоровье пачками. Именно поэтому вы не видите обновлений в режиме реального времени в приложении Google Fit. например шаги не меняются на лету, когда вы идете, а обновляются через определенные промежутки времени.

Прочтите документацию по Google Fit, чтобы узнать больше о том, как совершать HistoryApi звонки. На этой странице есть подробный пример получения количества шагов.

Таким образом, если вы загрузите данные, а затем прочитаете историю, данные будут соответствовать тому, что отображается в приложении Google Fit. В этом процессе он также может объединять данные из других источников, если таковые имеются, и давать нормализованное значение.

person AndroidMechanic - Viral Patel    schedule 14.01.2016
comment
спасибо.. уже прочитал. Дело в том, что я не хочу использовать API истории, потому что ему нужен интернет. Я хочу показать шаги, когда они также не подключены к Интернету. Google Fit также делает это - person Sayem; 14.01.2016
comment
да, Google Fit через регулярные промежутки времени может обновлять кеш локальной истории, а затем читать из него. Он будет синхронизироваться с сервером, когда снова подключится к Интернету. Чтобы убедиться в этом, вы можете проверить данные той же учетной записи на другом устройстве в приложении Google Fit. Но я не думаю, что есть способ получить доступ к кэшу локальной истории приложения Google Fit. Вы можете получить доступ к истории из другого приложения только после того, как оно синхронизирует данные с сервером. - person AndroidMechanic - Viral Patel; 14.01.2016
comment
да ты прав. нет возможности получить доступ к кешу фитов. Дело в том, что если Google Fit считает шаги, то как они это делают? они используют Fit Sensor API или у них есть другой механизм? - person Sayem; 14.01.2016
comment
Трудно сказать, не глядя на исходный код. Но просто пища для размышлений: если у Fit есть собственный сенсорный API, зачем ему использовать что-то еще? - person AndroidMechanic - Viral Patel; 14.01.2016
comment
да .. это то, что я хочу знать. Я что-то пропустил, чтобы подсчитать количество шагов, или они используют какой-то другой API. - person Sayem; 14.01.2016
comment
Как я уже говорил в предыдущих комментариях, они читаются из истории (кэш/сервер). - person AndroidMechanic - Viral Patel; 14.01.2016
comment
Попробуйте отправить данные, а затем прочитать из истории без подключения и посмотреть, что вы получите - person AndroidMechanic - Viral Patel; 14.01.2016
comment
Я читаю данные по истории API без подключения. Это работает.. :) Давайте посмотрим на разницу данных... - person Sayem; 15.01.2016
comment
Давайте продолжим обсуждение в чате. - person Sayem; 15.01.2016

Прежде всего, вы получаете значение датчика, которое используется для обновления в реальном времени, а не для статистической оценки.

Кроме того, вы читаете «дельту» шагов. «Дельта» означает, сколько шагов сделал пользователь с момента последнего обновления. Он используется для построения статистики, например. статистика ходьбы за день, час, месяц и т. д.

То, что вы на самом деле хотите прочитать, это "совокупные шаги" - в вашем случае это "общее количество шагов в день". Для этого вы используете HistoryApi

У вас есть два варианта:

<сильный>1. Чтение сводных данных

DataReadRequest readRequest = new DataReadRequest.Builder()
        // The data request can specify multiple data types to return, effectively
        // combining multiple data queries into one call.
        // In this example, it's very unlikely that the request is for several hundred
        // datapoints each consisting of a few steps and a timestamp.  The more likely
        // scenario is wanting to see how many steps were walked per day, for 7 days.
        .aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA)
                // Analogous to a "Group By" in SQL, defines how data should be aggregated.
                // bucketByTime allows for a time span, whereas bucketBySession would allow
                // bucketing by "sessions", which would need to be defined in code.
        .bucketByTime(1, TimeUnit.DAYS)
        .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
        .build();

PendingResult<DataReadResult> pendingResult =
                        Fitness.HistoryApi.readData(client, readRequest);

//synchronous execution, should happen on background thread
                DataReadResult result = pendingResult.await(CONNECTION_TIMEOUT_SECONDS, TimeUnit.SECONDS);
  1. Чтение итогов за день — в Google Fit есть удобная функция для чтения итогов за текущий день.

    PendingResult<DailyTotalResult> stepsTotalPending = Fitness.HistoryApi
        .readDailyTotal(client, DataType.TYPE_STEP_COUNT_DELTA);    
        //synchronous execution
    DailyTotalResult stepsTotalResult = stepsTotalPending
        .await(CONNECTION_TIMEOUT_SECONDS, TimeUnit.SECONDS);
    

Это то же самое, что и случай 1 с startTime = current day's midnight и endTime=now.

Здесь вы можете использовать любой тип данных, который поддерживает агрегацию, например. калории и расстояние. Подробности смотрите по этой ссылке.

Если вы используете решение 1 или 2 и у вас по-прежнему разные значения, см. это Часто задаваемые вопросы, - это известная ситуация, и приложение Google Fit может рассчитывать шаги/калории/расстояние с помощью более сложного подхода.

person Drew    schedule 11.05.2016
comment
спасибо за Ваш ответ. Я уже использую ваш первый подход. Это нормально, и количество шагов теперь ближе к данным приложения Google Fit. Но существует проблема. Он также подсчитывает некоторые шаги, когда пользователь использует транспорт, например, автомобиль, езду на велосипеде и т. д. Но в приложении Google Fit это не учитывается. Любая идея, как опустить это? - person Sayem; 11.05.2016