Skip to main content

expo-sensors

Version: 55.0.6 Provides access to a hardware device’s accelerometer, gyroscope, magnetometer, barometer, and pedometer.

Installation

npx expo install expo-sensors

Usage

import { Accelerometer } from 'expo-sensors';
import { useEffect, useState } from 'react';

function App() {
  const [data, setData] = useState({ x: 0, y: 0, z: 0 });

  useEffect(() => {
    Accelerometer.setUpdateInterval(100);
    
    const subscription = Accelerometer.addListener(setData);
    
    return () => subscription.remove();
  }, []);

  return <Text>x: {data.x.toFixed(2)}</Text>;
}

API Reference

Accelerometer

Accelerometer.addListener(listener)
(listener: (data: AccelerometerData) => void) => EventSubscription
Listens for accelerometer updates
const subscription = Accelerometer.addListener(({ x, y, z }) => {
  console.log({ x, y, z });
});
Accelerometer.setUpdateInterval(interval)
(interval: number) => void
Sets update interval in milliseconds
Accelerometer.isAvailableAsync()
() => Promise<boolean>
Checks if accelerometer is available

Gyroscope

Gyroscope.addListener(listener)
(listener: (data: GyroscopeData) => void) => EventSubscription
Listens for gyroscope updates
const subscription = Gyroscope.addListener(({ x, y, z }) => {
  console.log('Rotation:', { x, y, z });
});
Gyroscope.setUpdateInterval(interval)
(interval: number) => void
Sets update interval in milliseconds

Magnetometer

Magnetometer.addListener(listener)
(listener: (data: MagnetometerData) => void) => EventSubscription
Listens for magnetometer updates (compass)

Barometer

Barometer.addListener(listener)
(listener: (data: BarometerData) => void) => EventSubscription
Listens for barometer updates (air pressure)
const subscription = Barometer.addListener(({ pressure, relativeAltitude }) => {
  console.log('Pressure:', pressure, 'hPa');
});

Pedometer

Pedometer.isAvailableAsync()
() => Promise<boolean>
Checks if step counting is available
Pedometer.getStepCountAsync(start, end)
(start: Date, end: Date) => Promise<PedometerResult>
Gets step count for a time period
const now = new Date();
const start = new Date(now.getTime() - 24 * 60 * 60 * 1000);
const result = await Pedometer.getStepCountAsync(start, now);
console.log('Steps:', result.steps);
Pedometer.watchStepCount(listener)
(listener: (data: PedometerResult) => void) => EventSubscription
Watches for step count changes

DeviceMotion

DeviceMotion.addListener(listener)
(listener: (data: DeviceMotionData) => void) => EventSubscription
Listens for combined device motion dataIncludes acceleration, rotation, and orientation data.

Examples

Shake Detector

import { Accelerometer } from 'expo-sensors';
import { useEffect, useState } from 'react';
import { Text } from 'react-native';

function ShakeDetector() {
  const [shakeCount, setShakeCount] = useState(0);

  useEffect(() => {
    Accelerometer.setUpdateInterval(100);

    const subscription = Accelerometer.addListener(({ x, y, z }) => {
      const acceleration = Math.sqrt(x * x + y * y + z * z);
      
      if (acceleration > 2.5) {
        setShakeCount(c => c + 1);
      }
    });

    return () => subscription.remove();
  }, []);

  return <Text>Shakes detected: {shakeCount}</Text>;
}

Compass

import { Magnetometer } from 'expo-sensors';
import { useEffect, useState } from 'react';
import { Text, View } from 'react-native';

function Compass() {
  const [heading, setHeading] = useState(0);

  useEffect(() => {
    const subscription = Magnetometer.addListener(({ x, y }) => {
      let angle = Math.atan2(y, x) * (180 / Math.PI);
      if (angle < 0) angle += 360;
      setHeading(Math.round(angle));
    });

    return () => subscription.remove();
  }, []);

  return (
    <View style={{ alignItems: 'center' }}>
      <Text style={{ fontSize: 48 }}>{heading}°</Text>
      <Text>North</Text>
    </View>
  );
}

Step Counter

import { Pedometer } from 'expo-sensors';
import { useEffect, useState } from 'react';
import { Text } from 'react-native';

function StepCounter() {
  const [steps, setSteps] = useState(0);
  const [available, setAvailable] = useState(false);

  useEffect(() => {
    Pedometer.isAvailableAsync().then(setAvailable);

    if (available) {
      const subscription = Pedometer.watchStepCount(result => {
        setSteps(result.steps);
      });

      return () => subscription.remove();
    }
  }, [available]);

  return <Text>Steps today: {steps}</Text>;
}

Platform Support

SensoriOSAndroidWeb
Accelerometer
Gyroscope
Magnetometer
Barometer
Pedometer
DeviceMotion

Resources