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 updatesconst subscription = Accelerometer.addListener(({ x, y, z }) => {
console.log({ x, y, z });
});
Accelerometer.setUpdateInterval(interval)
(interval: number) => void
Sets update interval in milliseconds
Accelerometer.isAvailableAsync()
Checks if accelerometer is available
Gyroscope
Gyroscope.addListener(listener)
(listener: (data: GyroscopeData) => void) => EventSubscription
Listens for gyroscope updatesconst 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()
Checks if step counting is available
Pedometer.getStepCountAsync(start, end)
(start: Date, end: Date) => Promise<PedometerResult>
Gets step count for a time periodconst 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>;
}
| Sensor | iOS | Android | Web |
|---|
| Accelerometer | ✅ | ✅ | ✅ |
| Gyroscope | ✅ | ✅ | ✅ |
| Magnetometer | ✅ | ✅ | ❌ |
| Barometer | ✅ | ✅ | ❌ |
| Pedometer | ✅ | ✅ | ❌ |
| DeviceMotion | ✅ | ✅ | ✅ |
Resources