API de sensor del ángulo de la bisagra

El ángulo de la bisagra es un valor comprendido entre 0 y 360:

  • 0: el dispositivo está cerrado (las pantallas están una frente a la otra y no están visibles)
  • 90: el dispositivo está en forma de "L", también conocida como posición de portátil o de libro, en función de la orientación
  • 180: el dispositivo está plano
  • 360: el dispositivo está plegado de forma que las pantallas están alejadas entre sí y solo una de ellas funciona

Sugerencia

Este ejemplo de código se escribe para el sensor de ángulo de bisagra en la Surface Duo.

Window Manager de Jetpack tiene una API de DeviceState que proporciona información sobre la posición (p. ej., cerrado, abierto, semiabierto) y funciona en dispositivos de varios fabricantes.

Ejemplo de código

El ángulo de la bisagra se puede medir mediante el administrador del sensor de Android configurado con el nombre de sensor Hinge Angle.

private val HINGE_ANGLE_SENSOR_NAME = "Hinge Angle"

private var mSensorManager: SensorManager? = null
private var mHingeAngleSensor: Sensor? = null
private var mSensorListener: SensorEventListener? = null

// call setupSensors from onCreate
private fun setupSensors() {
    mSensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
    val sensorList: List<Sensor> = mSensorManager!!.getSensorList(Sensor.TYPE_ALL)
    for (sensor in sensorList) {
        if (sensor.getName().contains(HINGE_ANGLE_SENSOR_NAME)) {
            mHingeAngleSensor = sensor
        }
    }
    mSensorListener = object : SensorEventListener {
        override fun onSensorChanged(event: SensorEvent) {
            if (event.sensor == mHingeAngleSensor) {
                val angle = event.values[0].toInt()
                //TODO something with angle
            }
        }

        override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
            //TODO (if required)
        }
    }
}

override fun onPause() {
    super.onPause()
    if (mHingeAngleSensor != null) {
        mSensorManager?.unregisterListener(mSensorListener, mHingeAngleSensor)
    }
}

override fun onResume() {
    super.onResume()
    if (mHingeAngleSensor != null) {
        mSensorManager?.registerListener(
            mSensorListener,
            mHingeAngleSensor,
            SensorManager.SENSOR_DELAY_NORMAL
        )
    }
}