Visit Sponsor

Written by 10:46 am Android

Android Accelerometer Sensor Example – Detect Motion Data

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

ConstantDescription
SENSOR_DELAY_NORMALStandard rate
SENSOR_DELAY_UIUI update rate
SENSOR_DELAY_GAMEFaster rate for games
SENSOR_DELAY_FASTESTMaximum 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_ACCELERATION for gravity‑free motion detection
Visited 11 times, 1 visit(s) today
Close