API do sensor de ângulo de dobradiça

O ângulo da dobradiça é um valor de 0 a 360:

  • 0 – O dispositivo está fechado (as telas estão voltadas uma para a outra e não estão visíveis)
  • 90 – O dispositivo está em formato de "L", também conhecido como postura de laptop ou postura de livro, dependendo da orientação
  • 180 – O dispositivo está em uma postura plana
  • 360 – O dispositivo está dobrado de modo que as telas fiquem voltadas uma para a outra e apenas uma tela esteja operando

Dica

Este exemplo de código foi gravado para o sensor de ângulo da dobradiça no Surface Duo.

O Gerenciador de Janelas do Jetpack tem uma API DeviceState que fornece informações sobre postura (por exemplo, fechada, aberta, semiaberta) que funciona em dispositivos de vários fabricantes.

Exemplo de código

O ângulo da dobradiça pode ser medido usando o gerenciador de sensores do Android configurado com o nome do 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
        )
    }
}