Skip to content

Instantly share code, notes, and snippets.

@niusounds
Created June 29, 2018 03:08
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save niusounds/ab6f4cc6cae2b53292e90e67ce507f0d to your computer and use it in GitHub Desktop.
Save niusounds/ab6f4cc6cae2b53292e90e67ce507f0d to your computer and use it in GitHub Desktop.
Device orientation sensor data for LiveData.
import android.arch.lifecycle.LiveData
import android.content.Context
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
data class Orientation(
val azimuth: Float,
val pitch: Float,
val roll: Float
)
class OrientationLiveData(
context: Context,
private val sensorDelay: Int = SensorManager.SENSOR_DELAY_UI)
: LiveData<Orientation>(), SensorEventListener {
private val mSensorManager: SensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
private val accelerometer: Sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
private val magneticField: Sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)
private val mAccelerometerReading = FloatArray(3)
private val mMagnetometerReading = FloatArray(3)
private val mRotationMatrix = FloatArray(9)
private val mOrientationAngles = FloatArray(3)
override fun onActive() {
super.onActive()
mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL, sensorDelay)
mSensorManager.registerListener(this, magneticField, SensorManager.SENSOR_DELAY_NORMAL, sensorDelay)
}
override fun onInactive() {
super.onInactive()
mSensorManager.unregisterListener(this)
}
override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {}
// Get readings from accelerometer and magnetometer. To simplify calculations,
// consider storing these readings as unit vectors.
override fun onSensorChanged(event: SensorEvent) {
if (event.sensor == accelerometer) {
System.arraycopy(event.values, 0, mAccelerometerReading, 0, mAccelerometerReading.size)
} else if (event.sensor == magneticField) {
System.arraycopy(event.values, 0, mMagnetometerReading, 0, mMagnetometerReading.size)
}
updateOrientationAngles()
value = Orientation(mOrientationAngles[0], mOrientationAngles[1], mOrientationAngles[2])
}
// Compute the three orientation angles based on the most recent readings from
// the device's accelerometer and magnetometer.
private fun updateOrientationAngles() {
SensorManager.getRotationMatrix(mRotationMatrix, null, mAccelerometerReading, mMagnetometerReading)
SensorManager.getOrientation(mRotationMatrix, mOrientationAngles)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment