The accelerometer is one of the core motion sensors on Android devices. It measures the acceleration force along the X, Y, and Z axes — making it essential for motion detection, tilt controls, shake detection, and physics‑based interactions in apps and games.
This updated guide on javatechig.com explains how to access the accelerometer, register and unregister listeners, interpret sensor data, and follow best practices for performance in both Kotlin and Java, aligned with current Android platform patterns from Android Developers.
What Is the Accelerometer?
The accelerometer reports acceleration values including:
- X axis – Left/right tilt
- Y axis – Forward/backward tilt
- Z axis – Up/down force
Values are given in meters per second squared (m/s²). Zero indicates no force other than gravity.
Add Sensor Permissions (No Permission Required)
Unlike the GPS or camera, you don’t need runtime permissions to use the accelerometer. The sensor is available via the SensorManager API.
Just ensure your activity imports the sensor APIs:
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
Initialize the Accelerometer
Kotlin
private lateinit var sensorManager: SensorManager
private var accelerometer: Sensor? = null
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
Java
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
Check for null in case the device doesn’t have the sensor.
Implement SensorEventListener
To receive accelerometer updates, implement SensorEventListener:
Kotlin
private val accelListener = object : SensorEventListener {
override fun onSensorChanged(event: SensorEvent) {
val x = event.values[0]
val y = event.values[1]
val z = event.values[2]
Log.d("Accelerometer", "x: $x, y: $y, z: $z")
}
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {}
}
Java
SensorEventListener accelListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
Log.d("Accelerometer", "x: " + x + ", y: " + y + ", z: " + z);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
};
Register and Unregister Listener
Register in lifecycle methods:
Kotlin
override fun onResume() {
super.onResume()
sensorManager.registerListener(
accelListener,
accelerometer,
SensorManager.SENSOR_DELAY_NORMAL
)
}
override fun onPause() {
sensorManager.unregisterListener(accelListener)
super.onPause()
}
Java
@Override
protected void onResume() {
super.onResume();
sensorManager.registerListener(
accelListener, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
sensorManager.unregisterListener(accelListener);
super.onPause();
}
Use appropriate delays (SENSOR_DELAY_GAME, etc.) depending on update frequency.
Understanding Delay Constants
| Constant | Description |
|---|---|
SENSOR_DELAY_NORMAL | Standard rate |
SENSOR_DELAY_UI | UI update rate |
SENSOR_DELAY_GAME | Faster rate for games |
SENSOR_DELAY_FASTEST | Maximum rate |
Use lower rates only when necessary to reduce battery drain.
Detecting Shake Events
A simple shake detection:
Kotlin
val acceleration = sqrt(x * x + y * y + z * z)
if (acceleration > 15) {
Toast.makeText(this, "Device shook!", Toast.LENGTH_SHORT).show()
}
Java
float acceleration = (float) Math.sqrt(x*x + y*y + z*z);
if (acceleration > 15) {
Toast.makeText(this, "Device shook!", Toast.LENGTH_SHORT).show();
}
Tweak the threshold depending on sensitivity needs.
Avoiding Sensor Overload
- Do not process every event; apply smoothing or filtering
- Unregister listener when not visible
- Use appropriate delay constants
This conserves battery and reduces UI lag.
Common Issues & Fixes
No Sensor Found
Cause: Device doesn’t support accelerometer
Fix: Check for null before registering
High Noise or Jitter
Cause: Close proximity to magnetic fields
Fix: Apply filters like low‑pass to smooth data
Best Practices (2026 Updated)
- Keep sensor listener lifecycle–aware
- Choose data rate based on use case
- Avoid heavy computations inside
onSensorChanged() - Use
Sensor.TYPE_LINEAR_ACCELERATIONfor gravity‑free motion detection


