Google Fit para Android API de historial

Google Fit es una plataforma que permite a los desarrolladores crear aplicaciones que se centran en los datos de aptitud del usuario. Una de las herramientas que Google ha proporcionado es Google Fit para Android, que está disponible como un paquete en los Servicios de Google Play..

En un tutorial anterior, exploramos cómo utilizar la API de grabación de Google Fit para almacenar datos de aptitud física a través de Google Play Services. Este tutorial amplía el tema explorando cómo acceder y actualizar los datos almacenados en Google Fit usando el API de historial.

Lo que hace que Google Fit sea poderoso es que los datos de condición física se almacenan a través de los Servicios en la nube de Google, lo que permite acceder y analizarlos posteriormente. Mientras que las API de Sensores y Grabación se enfocan en la recopilación de datos de aptitud física desde un dispositivo Android, la API de Historial está destinada a brindar a los desarrolladores un acceso fácil a los datos almacenados..

Este tutorial lo guía a través de un proyecto de ejemplo que muestra cómo trabajar con la API de historial. El producto terminado se puede descargar desde GitHub..

1. Configuración del proyecto

Paso 1: configurar la consola de desarrollador

Para usar Google Fit, debe crear un ID de cliente de OAuth 2.0 y registrar su aplicación a través de la Consola de desarrolladores de Google. Puede encontrar una explicación detallada de cómo configurar un proyecto en la Consola de desarrollador de Google en mi tutorial sobre la API de sensores de ajuste de Google.

Paso 2: Crea el Proyecto Android

Una vez que haya configurado su aplicación para la autenticación en la Consola de desarrollador de Google, use el nombre del paquete que registró para crear una nueva aplicación de Android con un SDK mínimo de 9 y una Actividad.

Con la aplicación base de Android creada, abre construir.gradle e incluye Google Play Services en el nodo de dependencias y sincroniza tu aplicación.

compile 'com.google.android.gms: play-services-fitness: 8.4.0'

Ahora debería poder incluir las clases necesarias de Google Play Services en su aplicación. Antes de sumergirnos en el código Java para este tutorial, abra activity_main.xml y modificarlo para que incluya cinco. Botón Elementos que utilizaremos para demostrar algunas de las funciones de la API de historial..

  

Cuando ejecute su aplicación, la interfaz de usuario debería verse así:

Para continuar configurando tu proyecto, abre MainActivity.java e implementar las siguientes devoluciones de llamada y métodos requeridos:

  • GoogleApiClient.ConnectionCallbacks
  • GoogleAPiClient.OnConnectionFailedListener
  • View.OnClickListener

También es necesario agregar una variable miembro para el GoogleApiClient y un conjunto de referencias a su Botón objetos, como se muestra abajo.

la clase pública MainActivity extiende AppCompatActivity implementa GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, View.OnClickListener private Button mButtonViewWeek; Botón privado mButtonViewToday; Botón privado mButtonAddSteps; Botón privado mButtonUpdateSteps; Botón privado mButtonDeleteSteps; GoogleApiClient privado mGoogleApiClient; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); mButtonViewWeek = (Button) findViewById (R.id.btn_view_week); mButtonViewToday = (Button) findViewById (R.id.btn_view_today); mButtonAddSteps = (Button) findViewById (R.id.btn_add_steps); mButtonUpdateSteps = (Button) findViewById (R.id.btn_update_steps); mButtonDeleteSteps = (Button) findViewById (R.id.btn_delete_steps); mButtonViewWeek.setOnClickListener (this); mButtonViewToday.setOnClickListener (this); mButtonAddSteps.setOnClickListener (this); mButtonUpdateSteps.setOnClickListener (this); mButtonDeleteSteps.setOnClickListener (this);  @ Omitir public void onConnectionSuspended (int i) Log.e ("HistoryAPI", "onConnectionSuspended");  @ Anular la anulación pública onConnectionFailed (@NonNull ConnectionResult connectionResult) Log.e ("HistoryAPI", "onConnectionFailed");  public void onConnected (@Nullable Bundle bundle) Log.e ("HistoryAPI", "onConnected");  @Override public void onClick (View v) 

Lo último que debe hacer para configurar su proyecto de muestra es conectarse a Google Play Services. Esto se puede hacer al final de la onCreate () método.

mGoogleApiClient = new GoogleApiClient.Builder (this) .addApi (Fitness.HISTORY_API) .addScope (new Scope (Scopes.FITNESS_ACTIVITY_READ_WRITE)) .addConnectionCallbacks (this) .enableAutoManage (.)

Con el código anterior, nos conectamos a Google Play Services y solicitamos acceso a la API de historial en Google Fit, así como también permiso para leer y escribir datos de actividad. Añadiendo el enableAutoManage propiedad, Google Play Services gestiona la conexión y desconexión correctamente.

2. Usando la API de historial de ajuste de Google

Con la API de historial, puede recuperar y agregar datos, insertar valores que haya reunido en su aplicación o eliminar datos que puedan almacenarse. Una cosa importante a tener en cuenta es que todas las operaciones de API del historial en este tutorial deben realizarse fuera del hilo principal. En otras palabras, cada operación tiene lugar en una AsyncTask:

La clase privada ViewWeekStepCountTask extiende AsyncTask Void protegido doInBackground (Void ... params) displayLastWeeksData (); retorno nulo 

Paso 1: Mostrar datos a lo largo del tiempo

Una de las tareas que puede hacer es usar o mostrar datos que se han recopilado a lo largo del tiempo. Puedes hacer esto creando un nuevo DataReadRequest para un tipo específico de datos que se ajusta a algunos parámetros de consulta.

Puedes agrupar estos datos en Cangilón Objetos por tiempo o sesiones. Para este ejemplo, solicita datos de pasos agregados para la última semana y recopila esos datos por día.

Calendar cal = Calendar.getInstance (); Fecha ahora = nueva fecha (); cal.setTime (ahora); long endTime = cal.getTimeInMillis (); cal.add (Calendar.WEEK_OF_YEAR, -1); long startTime = cal.getTimeInMillis (); java.text.DateFormat dateFormat = DateFormat.getDateInstance (); Log.e ("History", "Range Start:" + dateFormat.format (startTime)); Log.e ("History", "Range End:" + dateFormat.format (endTime)); // Verifique cuántos pasos se caminaron y registraron en los últimos 7 días DataReadRequest readRequest = new DataReadRequest.Builder () .aggregate (DataType.TYPE_STEP_COUNT_DELTA). , TimeUnit.MILLISECONDS) .build ();

Una vez que tengas tu DataReadRequest creado, puede solicitar datos de la GoogleApiClient utilizando la Fitness.HistoriaApi.readData mando. Tu tambien llamas esperar en el cliente API para que el hilo se detenga hasta un minuto mientras se espera la consulta. Si algo sale mal, el hilo continúa después de ese minuto..

DataReadResult dataReadResult = Fitness.HistoryApi.readData (mGoogleApiClient, readRequest) .await (1, TimeUnit.MINUTES);

Si la llamada se realiza con éxito, puede acceder a los datos de condición física del usuario desde la DataReadResult objeto. Su solicitud de datos de paso se devuelve en Cangilón objetos, aunque otros tipos de datos se devuelven como Lista de Conjunto de datos objetos. Dependiendo del tipo de datos devueltos, puede acceder a ellos con el siguiente código:

// Se utiliza para datos agregados if (dataReadResult.getBuckets (). Size ()> 0) Log.e ("History", "Number of buckets:" + dataReadResult.getBuckets (). Size ()); para (Bucket bucket: dataReadResult.getBuckets ()) List dataSets = bucket.getDataSets (); para (DataSet dataSet: dataSets) showDataSet (dataSet);  // Se usa para datos no agregados si: (dataReadResult.getDataSets (). Size ()> 0) Log.e ("Historial", "Número de DataSets devueltos:" + dataReadResult.getDataSets (). Tamaño ()); para (DataSet dataSet: dataReadResult.getDataSets ()) showDataSet (dataSet); 

A continuación, puede recuperar cada Punto de datos desde el Conjunto de datos objetos que han sido devueltos.

private void showDataSet (DataSet dataSet) Log.e ("History", "Datos devueltos para el tipo de datos:" + dataSet.getDataType (). getName ()); DateFormat dateFormat = DateFormat.getDateInstance (); DateFormat timeFormat = DateFormat.getTimeInstance (); para (DataPoint dp: dataSet.getDataPoints ()) Log.e ("Historial", "Punto de datos:"); Log.e ("History", "\ tType:" + dp.getDataType (). GetName ()); Log.e ("History", "\ tStart:" + dateFormat.format (dp.getStartTime (TimeUnit.MILLISECONDS)) + "" + timeFormat.format (dp.getStartTime (TimeUnit.MILLISECONDS))); Log.e ("History", "\ tEnd:" + dateFormat.format (dp.getEndTime (TimeUnit.MILLISECONDS)) + "" + timeFormat.format (dp.getStartTime (TimeUnit.MILLISECONDS))); para (Campo: dp.getDataType (). getFields ()) Log.e ("History", "\ tField:" + field.getName () + "Valor:" + dp.getValue (field)); 

Si una aplicación en el dispositivo del usuario ha activado la API de grabación durante la última semana, recibirá datos por cada día que estuvo activa. Los registros del código anterior deben ser similares a esto:

E / Historial: Rango Inicio: 17 de febrero de 2016 E / Historial: Rango final: 24 de febrero de 2016 E / Historial: Número de depósitos: 7 E / Historial: Datos devueltos para Tipo de datos: com.google.step_count.delta E / Historia: Punto de datos: E / Historia: Tipo: com.google.step_count.delta E / Historia: Inicio: 17 de febrero de 2016 11:01:46 PM E / Historia: Fin: 17 de febrero de 2016 11:01:46 PM E / Historial: Campo: pasos Valor: 9360 E / Historial: Datos devueltos para Tipo de datos: com.google.step_count.delta E / Historial: Datos devueltos para Tipo de datos: com.google.step_count.delta E / Historial: Datos devueltos para Tipo de datos: com.google.step_count.delta E / Historia: Punto de datos: E / Historia: Tipo: com.google.step_count.delta E / Historia: Inicio: 21 de febrero de 2016 9:58:03 AM E / Historia : Fin: 21 de febrero de 2016 9:58:03 AM E / Historial: Campo: pasos Valor: 10041 E / Historial: Datos devueltos para Tipo de datos: com.google.step_count.delta E / Historial: Punto de datos: E / Historial : Escriba: com.google.step_count.delta E / History: Inicio: 21 de febrero de 2016 11:22:53 PM E / History: Fin: 22 de febrero de 2016 11:22:53 PM E / History: Campo: pasos Valor : 10786 E / History: Datos devueltos para el tipo de datos: com.google.step_count.delta E / History: Punto de datos: E / History: Tipo: com.google.step_count.delta E / History: Inicio: 22 de febrero de 2016 11 : 06: 31 PM E / History: Fin: 23 de febrero de 2016 11:06:31 PM E / History: Campo: pasos Valor: 13099 E / History: Datos devueltos para el tipo de datos: com.google.step_count.delta E / Historial: Punto de datos: E / Historial: Tipo: com.google.step_count.delta E / Historial: Inicio: 23 de febrero de 2016 11:02:31 PM E / Historia: Fin: 24 de febrero de 2016 11:02:31 PM E / Historia: Campo: pasos Valor: 9765

Paso 2: Visualización de datos para hoy

Ahora ya sabe cómo recuperar datos de Google Fit en función de un período de tiempo. Un caso de uso común que tienen los desarrolladores es la necesidad de datos para el día actual. Afortunadamente, Google lo ha facilitado al agregar el Fitness.HistoriaApi.readDailyTotal llamada, que crea un DailyTotalResult Objeto que contiene los datos recogidos para el día..

private void displayStepDataForToday () DailyTotalResult result = Fitness.HistoryApi.readDailyTotal (mGoogleApiClient, DataType.TYPE_STEP_COUNT_DELTA) .await (1, TimeUnit.MINUTES); showDataSet (result.getTotal ()); 

El código anterior cierra la sesión de los datos del paso del usuario para el día.

E / Historial: Datos devueltos para Tipo de datos: com.google.step_count.delta E / Historial: Punto de datos: E / Historial: Tipo: com.google.step_count.delta E / Historial: Inicio: 24 de febrero de 2016 8:39 : 59 AM E / History: Fin: 24 de febrero de 2016 8:39:59 AM E / History: Campo: pasos Valor: 9474

Paso 3: Inserción de datos en Google Fit

Si bien es importante poder leer los datos de Google Fit, puede haber ocasiones en las que necesite agregar sus propios datos recopilados al almacén de datos de Google Fit. Para hacer esto, selecciona un rango de tiempo para los datos y creas un Fuente de datos Objeto que representa el tipo de información que pones en Google Fit. A continuación, creas un Conjunto de datos objetar y colocar un nuevo Punto de datos en él para la operación de inserción.

Para este ejemplo, vamos a asumir que el usuario ha caminado un millón de pasos, o aproximadamente 500 millas, e insertará los datos de pasos sin procesar en la última hora de la actividad del usuario..

Es importante tener en cuenta que si selecciona un rango de tiempo que abarca varios días, la cantidad de pasos que inserta se distribuye uniformemente entre esos días..

Calendar cal = Calendar.getInstance (); Fecha ahora = nueva fecha (); cal.setTime (ahora); long endTime = cal.getTimeInMillis (); cal.add (Calendar.HOUR_OF_DAY, -1); long startTime = cal.getTimeInMillis (); DataSource dataSource = new DataSource.Builder () .setAppPackageName (this) .setDataType (DataType.TYPE_STEP_COUNT_DELTA) .setName ("Step Count") .setType (DataSource.TYPE_RAW) .build (); int stepCountDelta = 1000000; DataSet dataSet = DataSet.create (dataSource); DataPoint point = dataSet.createDataPoint () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS); point.getValue (Field.FIELD_STEPS) .setInt (stepCountDelta); dataSet.add (punto);

Después de crear el Conjunto de datos objeto, puede insertarlo en el almacén de datos de Google Fit utilizando las API de historial Insertar datos llamada.

Fitness.HistoryApi.insertData (mGoogleApiClient, dataSet) .await (1, TimeUnit.MINUTES);

Si inserta los pasos del usuario y luego lee el registro de actividades, debería ver algo similar a lo siguiente:

E / Historial: Datos devueltos para Tipo de datos: com.google.step_count.delta E / Historial: Punto de datos: E / Historial: Tipo: com.google.step_count.delta E / Historial: Inicio: 27 de febrero de 2016 10:05 : 18 PM E / Historia: Fin: 28 de febrero de 2016 10:05:18 PM E / Historia: Campo: pasos Valor: 1008747

Paso 4: Actualizar datos en Google Fit

Una vez que haya insertado datos en Google Fit, no podrá insertar más datos de ese tipo si se superponen con los datos existentes. Esto podría causar un problema si el usuario hubiera caminado 500 millas y luego hubiera caminado 500 más..

Para resolver esto, necesitas usar el actualizar datos llamada. Afortunadamente, la actualización de datos es casi idéntica a la inserción de nuevos datos, excepto que creas un DataUpdateRequest en lugar.

Calendar cal = Calendar.getInstance (); Fecha ahora = nueva fecha (); cal.setTime (ahora); long endTime = cal.getTimeInMillis (); cal.add (Calendar.HOUR_OF_DAY, -1); long startTime = cal.getTimeInMillis (); DataSource dataSource = new DataSource.Builder () .setAppPackageName (this) .setDataType (DataType.TYPE_STEP_COUNT_DELTA) .setName ("Step Count") .setType (DataSource.TYPE_RAW) .build (); int stepCountDelta = 2000000; DataSet dataSet = DataSet.create (dataSource); DataPoint point = dataSet.createDataPoint () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS); point.getValue (Field.FIELD_STEPS) .setInt (stepCountDelta); dataSet.add (punto); DataUpdateRequest updateRequest = new DataUpdateRequest.Builder (). SetDataSet (dataSet) .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS) .build (); Fitness.HistoryApi.updateData (mGoogleApiClient, updateRequest) .await (1, TimeUnit.MINUTES);

Si fuera a cerrar sesión los pasos del usuario para el día después de ejecutar lo anterior, debería ver más de dos millones de pasos.

E / Historial: Datos devueltos para Tipo de datos: com.google.step_count.delta E / Historial: Punto de datos: E / Historial: Tipo: com.google.step_count.delta E / Historial: Inicio: 27 de febrero de 2016 10:05 : 18 PM E / Historia: Fin: 28 de febrero de 2016 10:05:18 PM E / Historia: Campo: pasos Valor: 2008747

Paso 5: Eliminar datos de Google Fit

La operación final disponible a través de la API del historial de Google Fit es la capacidad de eliminar datos que haya almacenado en Google Fit. Esto se puede hacer seleccionando un rango de fechas, creando un DataDeleteRequest objeto, y llamando borrar datos de la API de historia. Si bien puede eliminar sus propios datos insertados, los datos almacenados por Google Fit no se eliminan.

Calendar cal = Calendar.getInstance (); Fecha ahora = nueva fecha (); cal.setTime (ahora); long endTime = cal.getTimeInMillis (); cal.add (Calendar.DAY_OF_YEAR, -1); long startTime = cal.getTimeInMillis (); DataDeleteRequest request = new DataDeleteRequest.Builder () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS) .addDataType (DataType.TYPE_STEP_COUNT_DELTA) .build (); Fitness.HistoryApi.deleteData (mGoogleApiClient, request) .await (1, TimeUnit.MINUTES);

Conclusión

Como ha visto, la API de historial es una herramienta increíblemente poderosa para acceder y manipular el almacén de datos de Google Fit. Mientras que otras API de Google Fit están destinadas a recopilar datos, la API de historial le permite mantener y acceder a los datos para su análisis. Ahora debería poder crear aplicaciones increíbles que aprovechen esta función..