Как получить количество шагов от Google Fit REST API, например, приложение Google Fit?

Я разрабатываю приложение PHP, которое работает с API Google Fit, чтобы собирать счетчик ежедневных пользователей.

Я хочу получить счетчик шагов от «15 января 2015 года 00:00:00 GMT + 0700» до «16 января 2015 года 00:00:00 GMT + 0700». – Во-первых, я получаю все свои источники данных. – Затем, с каждым источником данных, который имеет тип данных, равный «com.google.step_count.delta», я получаю наборы данных между вышеуказанными отметками времени и добавляю возвращаемые значения вместе.

Мой код: https://gist.github.com/daitr-gu/472c4f18522172542cca
Мой результат: https://gist.github.com/daitr-gu/1a7e11eb483a657bdc8b

Я обнаружил, что существует много источников данных, и они возвращают разные значения. И значения слишком отличаются от того, что я вижу в приложении Google Fit на моем телефоне.

Вопросов:
1. Какой источник данных использует приложение Google Fit для вычисления количества шагов?
2. Почему существуют разные значения данных и значение Google Fit?
3. Как я могу получить значение Google Fit?

Я думаю, что разница, которую вы видите, – это разница между тем, как Google использует API истории и API датчиков. Если вы используете PHP, вы запрашиваете Google Fit Store через ansible API пригодности, и это зависит от того, что App имеет возможность сохранять с помощью API записи. Таким образом, вы можете не видеть все данные, доступные устройству.

Google Fit APIs

Я думаю, но не знаю наверняка, что приложение Fit использует датчики api. В приложении вы можете использовать API-интерфейсы датчиков, как описано в API-интерфейсе API Документов Google, и обрабатывать возвращенные данные по вашему желанию.

Ниже показан простой способ получить шаги с помощью TYPE_STEP_COUNT_CUMULATIVE и TYPE_RAW

Fitness.SensorsApi.findDataSources(mClient, new DataSourcesRequest.Builder() // At least one datatype must be specified. .setDataTypes(DataType.TYPE_STEP_COUNT_CUMULATIVE) // Can specify whether data type is raw or derived. .setDataSourceTypes(DataSource.TYPE_RAW) .build()) .setResultCallback(new ResultCallback() { @Override public void onResult(DataSourcesResult dataSourcesResult) { Log.i(TAG, "Result: " + dataSourcesResult.getStatus().toString()); for (DataSource dataSource : dataSourcesResult.getDataSources()) { Log.i(TAG, "Data source found: " + dataSource.toString()); Log.i(TAG, "Data Source type: " + dataSource.getDataType().getName()); //Let's register a listener to receive Activity data! if (dataSource.getDataType().equals(DataType.TYPE_STEP_COUNT_CUMULATIVE) && mListener == null) { Log.i(TAG, "Data source for TYPE_STEP_COUNT_CUMULATIVE found! Registering."); registerFitnessDataListener(dataSource, DataType.TYPE_STEP_COUNT_CUMULATIVE); } } } }); private void registerFitnessDataListener(DataSource dataSource, DataType dataType) { mListener = new OnDataPointListener() { @Override public void onDataPoint(DataPoint dataPoint) { for (Field field : dataPoint.getDataType().getFields()) { Value val = dataPoint.getValue(field); Log.i(TAG, "Detected DataPoint field: " + field.getName()); Log.i(TAG, "Detected DataPoint value: " + val); Log.i(TAG, "Difference in steps: " + (val.asInt()-previousValue)); previousValue = val.asInt(); } } }; Fitness.SensorsApi.add( mClient, new SensorRequest.Builder() .setDataSource(dataSource) // Optional but recommended for custom data sets. .setDataType(dataType) // Can't be omitted. .setSamplingRate(10, TimeUnit.SECONDS) .build(), mListener) .setResultCallback(new ResultCallback() { @Override public void onResult(Status status) { if (status.isSuccess()) { Log.i(TAG, "Listener registered!"); } else { Log.i(TAG, "Listener not registered."); } } }); } 

Вы можете обнаружить, что это дает вам более близкое значение, чем у Fit App. Однако это, очевидно, доступно только на устройстве, поэтому вам нужно будет запустить фоновый сервис, который обновит внешнюю базу данных, что дает вам API записи и истории.

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

ОБНОВИТЬ:

Написав выше, я подумал, что должен проверить это. Это было по утрам.

  • Apple iPhone 6 HealthKit: 6 762
  • Apple iPhone 6 Мое приложение: 6,762
  • Android Nexus 6 Fit: 6 920
  • Android Nexus 6 Мое приложение: 6,920 (использует HistoryAPI)
  • Android Rest API: оценочные_ступки: 6,928
  • Android Rest API merge_step_deltas: 6,911

Это из сообщения Google+, которое вы можете найти здесь.

«merge_step_deltas дает вам объединенный stream всех ваших счетчиков шагов. valu_steps также учитывает активность и оценивает шаги, когда их нет»

Тот, который я еще не получил до конца, – это датчики, использующие то, что я показываю выше, это дает мне всего 2,548 шагов.

Другая незначительная любопытная вещь заключается в том, что через день Fit показывает мне, что я сделал 6 668 шагов, поэтому ближе к результату Apple, но перерасчет из того, что он изначально показал мне после синхронизации данных. Мое приложение по-прежнему показывает 6 920!

Время для всего этого для синхронизации я не измерял.

  1. Какой источник данных использует приложение Google Fit для вычисления количества шагов?

Приложение Google Fit использует источник данных с оценкой_steps для вычисления количества шагов. DataSourceId: производный: com.google.step_count.delta: com.google.android.gms: примерный_steps

  1. Почему между стоимостью данных и значением Google Fit существуют разные значения?

Каждый источник данных представляет собой другое устройство / источник. Я вижу, что у вас есть Sony Smart Watch и HTC Desire, подключенные к Google Fit. Каждое из ваших устройств сообщает значения Fit, которые объединены вместе. Merge_step_deltas дает вам объединенный stream всех ваших счетчиков шагов. Estimated_steps также учитывает активность и оценивает шаги, когда их нет.

  1. Как я могу получить значение Google Fit?

API REST может получить доступ только к данным, которые были синхронизированы с бэкэнд. Чтобы получить те же значения, что и Google Fit, прочитайте источник данных оцененных_steps. Он должен быть таким же, как на https://fit.google.com/ . Устройство может иметь последние значения, которые еще не синхронизированы с сервером. Мы работаем над тем, чтобы сделать синхронизацию и кросс-платформенный интерфейс более плавным.

– Инженер в Google Fit Team.

Мне повезло с derived:com.google.step_count.delta:com.google.android.gms:estimated_steps

Результат был выше, чем то, что читал мой телефон, поэтому я отфильтровал на своих двух основных шаговых устройствах: select{|q| q["originDataSourceId"] =~ /360|Nexus/} select{|q| q["originDataSourceId"] =~ /360|Nexus/} и это дало мне ближайший результат.

Если я попробую другой диапазон дней позже, и он полностью со стены, я вернусь и заметлю это здесь.

Давайте будем гением компьютера.