Docs-logo

Expo

Get Started
API Reference
Slash-shortcut-icon
Hamburger-icon

Pedometer

Pedometer from expo-sensors uses Core Motion on iOS and the system hardware.Sensor on Android to get the user's step count, and also allows you to subscribe to pedometer updates.

Platform Compatibility

Android DeviceAndroid EmulatoriOS DeviceiOS SimulatorWeb
Status-success-iconStatus-success-iconStatus-success-iconStatus-success-iconStatus-failed-icon

Installation

Terminal
→ expo install expo-sensors

If you're installing this in a bare React Native app, you should also follow these additional installation instructions.

import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { Pedometer } from 'expo-sensors';

export default class App extends React.Component {
  state = {
    isPedometerAvailable: 'checking',
    pastStepCount: 0,
    currentStepCount: 0,
  };

  componentDidMount() {
    this._subscribe();
  }

  componentWillUnmount() {
    this._unsubscribe();
  }

  _subscribe = () => {
    this._subscription = Pedometer.watchStepCount(result => {
      this.setState({
        currentStepCount: result.steps,
      });
    });

    Pedometer.isAvailableAsync().then(
      result => {
        this.setState({
          isPedometerAvailable: String(result),
        });
      },
      error => {
        this.setState({
          isPedometerAvailable: 'Could not get isPedometerAvailable: ' + error,
        });
      }
    );

    const end = new Date();
    const start = new Date();
    start.setDate(end.getDate() - 1);
    Pedometer.getStepCountAsync(start, end).then(
      result => {
        this.setState({ pastStepCount: result.steps });
      },
      error => {
        this.setState({
          pastStepCount: 'Could not get stepCount: ' + error,
        });
      }
    );
  };

  _unsubscribe = () => {
    this._subscription && this._subscription.remove();
    this._subscription = null;
  };

  render() {
    return (
      <View style={styles.container}>
        <Text>Pedometer.isAvailableAsync(): {this.state.isPedometerAvailable}</Text>
        <Text>Steps taken in the last 24 hours: {this.state.pastStepCount}</Text>
        <Text>Walk! And watch this go up: {this.state.currentStepCount}</Text>
      </View>
    );
  }
}

%%placeholder-start%%const styles = StyleSheet.create({ ... }); %%placeholder-end%%const styles = StyleSheet.create({
  container: {
    flex: 1,
    marginTop: 15,
    alignItems: 'center',
    justifyContent: 'center',
  },
});

import { Pedometer } from 'expo-sensors';

  • Undo-iconPromise<PermissionResponse>

NameTypeDescription
startDateA date indicating the start of the range over which to measure steps.
endDateA date indicating the end of the range over which to measure steps.

Get the step count between two dates.

Returns a promise that fulfills with a PedometerResult.

As Apple documentation states:

Info-icon
Only the past seven days worth of data is stored and available for you to retrieve. Specifying a start date that is more than seven days in the past returns only the available data.

Returns whether the pedometer is enabled on the device.

Returns a promise that fulfills with a boolean, indicating whether the pedometer is available on this device.

NameTypeDescription
callbackPedometerUpdateCallbackA callback that is invoked when new step count data is available. The callback is provided with a single argument that is PedometerResult.

Subscribe to pedometer updates.

Returns a Subscription that enables you to call remove() when you would like to unsubscribe the listener.

NameTypeDescription
canAskAgainboolean-
expiresPermissionExpiration-
grantedboolean-
statusPermissionStatus-

NameTypeDescription
stepsnumberNumber of steps taken between the given dates.

Acceptable values are: 'never', number.

NameTypeDescription
remove() => voidA method to unsubscribe the listener.

PermissionStatus.DENIED = "denied"
PermissionStatus.GRANTED = "granted"
PermissionStatus.UNDETERMINED = "undetermined"

You'll need to configure an Android OAuth client for your app on the Google Play console for it to work as a standalone application on the Android platform. See https://developers.google.com/fit/android/get-api-key