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..
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.
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.
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 AsyncTaskVoid protegido doInBackground (Void ... params) displayLastWeeksData (); retorno nulo
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 ()) ListdataSets = 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
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
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
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
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);
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..