A React Native bridge module for interacting with Google Fit
-
import GoogleFit, { Scopes } from 'react-native-google-fit'
-
Authorize:
// The list of available scopes inside of src/scopes.js file const options = { scopes: [ Scopes.FITNESS_ACTIVITY_READ_WRITE, Scopes.FITNESS_BODY_READ_WRITE, ], } GoogleFit.authorize(options) .then(authResult => { if (authResult.success) { dispatch("AUTH_SUCCESS"); } else { dispatch("AUTH_DENIED", authResult.message); } }) .catch(() => { dispatch("AUTH_ERROR"); }) // ... // Call when authorized GoogleFit.startRecording((callback) => { // Process data from Google Fit Recording API (no google fit app needed) });
Alternatively you can use event listeners (deprecated)
GoogleFit.onAuthorize(() => { dispatch('AUTH SUCCESS') }) GoogleFit.onAuthorizeFailure(() => { dispatch('AUTH ERROR') })
-
Retrieve Steps For Period
const options = { startDate: "2017-01-01T00:00:17.971Z", // required ISO8601Timestamp endDate: new Date().toISOString() // required ISO8601Timestamp }; GoogleFit.getDailyStepCountSamples(options) .then((res) => { console.log('Daily steps >>> ', res) }) .catch((err) => {console.warn(err)})
Response:
[
{ source: "com.google.android.gms:estimated_steps", steps: [] },
{ source: "com.google.android.gms:merge_step_deltas", steps: [] },
{ source: "com.xiaomi.hm.health", steps: [] }
];
-
Retrieve Weights
const opt = { unit: "pound", // required; default 'kg' startDate: "2017-01-01T00:00:17.971Z", // required endDate: new Date().toISOString(), // required ascending: false // optional; default false }; GoogleFit.getWeightSamples(opt, (err, res) => { console.log(res); });
-
Retrieve Heights
const opt = { startDate: "2017-01-01T00:00:17.971Z", // required endDate: new Date().toISOString(), // required }; GoogleFit.getHeightSamples(opt, (err, res) => { console.log(res); });
-
Save Weights
const opt = { value: 200, date: new Date().toISOString(), unit: "pound" }; GoogleFit.saveWeight(opt, (err, res) => { if (err) throw "Cant save data to the Google Fit"; });
-
Blood pressure and Heart rate methods (since version 0.8)
const options = { startDate: "2017-01-01T00:00:17.971Z", // required endDate: new Date().toISOString(), // required } const callback = ((error, resoponse) => { }) GoogleFit.getHeartRateSamples(options, callback) GoogleFit.getBloodPressureSamples(options, callback)
-
Get all activities
let options = { startDate: new Date(2018, 9, 17).valueOf(), // simply outputs the number of milliseconds since the Unix Epoch endDate: new Date(2018, 9, 18).valueOf() }; GoogleFit.getActivitySamples(options, (err, res) => { console.log(err, res) });
response:
[ { sourceName: 'Android', device: 'Android', sourceId: 'com.google.android.gms', calories: 764.189208984375, quantity: 6, end: 1539774300992, tracked: true, activityName: 'still', start: 1539727200000 }, { sourceName: 'Android', device: 'Android', sourceId: 'com.google.android.gms', calories: 10.351096153259277, quantity: 138, end: 1539774486088, tracked: true, distance: 88.09545135498047, activityName: 'walking', }]
Where:
sourceName = device - 'Android' or 'Android Wear' string sourceId - return a value of dataSource.getAppPackageName(). For more info see: https://developers.google.com/fit/android/data-attribution start/end - timestamps of activity in format of milliseconds since the Unix Epoch tracked - bool flag, is this activity was entered by user or tracked by device. Detected by checking milliseconds of start/end timestamps. Since when user log activity in googleFit they can't set milliseconds distance(opt) - A distance in meters. activityName - string, equivalent one of these https://developers.google.com/fit/rest/v1/reference/activity-types calories(opt) - double value of burned Calories in kcal. quantity(opt) - equivalent of steps number
Note that optional parametrs are not presented in all activities - only where google fit return some results for this field. Like no distance for still activity.
-
Other methods:
observeSteps(callback); // On Step Changed Event unsubscribeListeners(); // Put into componentWillUnmount() method to prevent leaks /** * {@see getDailyCalorieSamples} * const options = { * startDate: new Date(2018, 9, 17).valueOf(), // simply outputs the number of milliseconds since the Unix Epoch * endDate: new Date().now(), * basalCalculation: false, * } * method to get calories per day, options object could contain basalCalculation (bool) to calculate or not basalAVG over the week */ getDailyCalorieSamples(options, callback); getDailyDistanceSamples(options, callback); // method to get daily distance isAvailable(callback); // Checks is GoogleFit available for current account / installed on device isEnabled(callback); // Checks is permissions granted deleteWeight(options, callback); // method to delete weights by options (same as in save weights) openFit(); //method to open google fit app saveHeight(options, callback); deleteHeight(options, callback); deleteWeight(options, callback); disconnect(); // Closes the connection to Google Play services.
- code refactoring
- optimization
Copyright (c) 2017-present, Stanislav Doskalenko [email protected]
Based on Asim Malik android source code, copyright (c) 2015, thanks mate!