API датчика угла разворота

Угол разворота может принимать значения от 0 до 360:

  • 0 — устройство закрыто (экраны повернуты друг к другу и не видны).
  • 90 — устройство имеет вид буквы L (также называется ноутбучной позицией) или книги в зависимости от ориентации.
  • 180 — устройство полностью развернуто.
  • 360 — устройство сложено таким образом, что экраны повернуты друг от друга и работает только один экран.

Совет

Этот пример кода написан для датчика угла разворота в Surface Duo.

The Jetpack Window Manager содержит API DeviceState, который предоставляет сведения о состоянии (закрыто, открыто, полуоткрыто) для устройств различных производителей.

Пример кода

Угол разворота можно измерить с помощью диспетчера датчиков Android, настроенного с именем датчика 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
        )
    }
}