¿Cómo obtener el conteo de pasos de Google Fit REST API como la aplicación Google Fit?

Estoy desarrollando una aplicación PHP que funciona con las API de Google Fit para recostackr el recuento de pasos del usuario todos los días.

Quiero obtener mi conteo de pasos desde “15 de enero de 2015 00:00:00 GMT + 0700” hasta “16 de enero de 2015 00:00:00 GMT + 0700”. – Primero, obtengo todos mis orígenes de datos. – Luego, con cada fuente de datos que tiene el tipo de datos igual a “com.google.step_count.delta”, obtengo conjuntos de datos entre las marcas de tiempo anteriores y agrego los valores de retorno juntos.

Mi código: https://gist.github.com/daitr-gu/472c4f18522172542cca
Mi resultado: https://gist.github.com/daitr-gu/1a7e11eb483a657bdc8b

Encontré eso, hay muchos datasources y devuelven valores diferentes. Y los valores son muy diferentes de lo que veo en la aplicación Google Fit en mi teléfono.

Preguntas:
1. ¿Qué fuente de datos usa la aplicación Google Fit para calcular el conteo de pasos?
2. ¿Por qué hay diferentes entre el valor de las fonts de datos y el valor de Google Fit?
3. ¿Cómo puedo obtener el valor de Google Fit?

Creo que la diferencia que está viendo es la diferencia entre cómo usa Google History API y Sensors API. Si usa PHP, está consultando Google Fit Store a través de la API de estado físico disponible y esto depende de lo que la aplicación haya podido guardar a través de la API de grabación. Por lo tanto, es posible que no vea todos los datos que el dispositivo tiene disponibles.

API de Google Fit

Creo, pero no estoy seguro, que la aplicación Fit usa la API de los sensores. Dentro de la aplicación puede usar la API de sensores como se describe en la API de Google Docs Sensors y manipular los datos devueltos como lo desee.

A continuación, se muestra una forma sencilla de obtener pasos con TYPE_STEP_COUNT_CUMULATIVE y 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."); } } }); } 

Puede encontrar que esto le da un valor más cercano al que le da la aplicación Fit. Sin embargo, esto obviamente solo está disponible en el dispositivo, por lo que necesitaría ejecutar un servicio en segundo plano que actualizara una base de datos externa, que es lo que las API de Registro e Historial le brindan.

Como un punto a tener en cuenta para asegurar que los datos continúen siendo enviados a la Tienda de Fitness cuando su aplicación está en segundo plano, necesita usar la API de grabación, esto también puede cambiar los valores que está viendo.

ACTUALIZAR:

Después de haber escrito lo anterior, pensé que debería probarlo. Esto fue de una mañana caminando.

  • Kit de salud de Apple iPhone 6: 6.762
  • Apple iPhone 6 Mi aplicación: 6,762
  • Android Nexus 6 Fit: 6,920
  • Android Nexus 6 My App: 6,920 (Utiliza la HistoryAPI)
  • Android Rest API estimate_steps: 6,928
  • Android Rest API merge_step_deltas: 6,911

Esto es de una publicación de Google+ que puedes encontrar aquí

“merge_step_deltas le brinda la secuencia combinada de todos sus contadores de pasos. estimated_steps también tiene en cuenta la actividad y estima los pasos cuando no los hay”

El que aún no tengo al fondo es que los sensores usan lo que muestro arriba, solo me da 2,548 pasos.

La otra cosa marginalmente curiosa es que un día más tarde Fit me muestra que hice 6,668 pasos, tan cerca del resultado de Apple, pero un recálculo de lo que inicialmente me mostró después de que los datos se habían sincronizado. ¡Mi aplicación todavía muestra 6.920!

El tiempo para sincronizar todo no lo medí.

  1. ¿Qué fuente de datos usa la aplicación Google Fit para calcular el recuento de pasos?

La aplicación Google Fit usa el origen de datos de los valores estimados para calcular los recuentos de pasos. DataSourceId: derived: com.google.step_count.delta: com.google.android.gms: estimate_steps

  1. ¿Por qué hay diferentes entre el valor de las fonts de datos y el valor de Google Fit?

Cada fuente de datos representa un dispositivo / fuente diferente. Veo que tiene un Smart Watch de Sony y un HTC Desire conectados a Google Fit. Cada uno de sus dispositivos informa los valores a Fit que se fusionan. Merge_step_deltas le proporciona la secuencia combinada de todos sus contadores de pasos. Estimated_steps también tiene en cuenta la actividad y estima los pasos cuando no los hay.

  1. ¿Cómo puedo obtener el valor de Google Fit?

La API REST solo puede acceder a los datos que se han sincronizado con el servidor. Para obtener los mismos valores que Google Fit, lea la fuente de datos de estimate_steps. Debe ser el mismo que ve en https://fit.google.com/ . El dispositivo podría tener los últimos valores que aún no están sincronizados con el servidor. Estamos trabajando para que las sincronizaciones y la experiencia multiplataforma sean más fluidas.

– Ingeniero en Google Fit Team.

Tuve la mayor parte de la suerte con derived:com.google.step_count.delta:com.google.android.gms:estimated_steps

El resultado fue más alto inicialmente que lo que mi teléfono estaba leyendo, así que luego filtré en mis dos dispositivos de paso principal, select{|q| q["originDataSourceId"] =~ /360|Nexus/} select{|q| q["originDataSourceId"] =~ /360|Nexus/} y eso me dio el resultado más cercano.

Si bash un día diferente más tarde y está completamente fuera de la pared, volveré y lo notaré aquí.