API sensore dell'angolo della cerniera

L'angolo della cerniera è un valore compreso tra 0 e 360:

  • 0: il dispositivo è chiuso (gli schermi sono uno di fronte all'altro e non visibili)
  • 90: il dispositivo ha una forma a "L" con una posizione simile a quella di un portatile o di un libro a seconda dell'orientamento
  • 180: il dispositivo ha una superficie piana
  • 360: il dispositivo è stato ripiegato in modo che gli schermi siano uno opposto all'altro e solo uno è funzionante

Suggerimento

Questo esempio di codice è scritto per il sensore dell'angolo della cerniera in Surface Duo.

Jetpack Window Manager ha un'API DeviceState che fornisce informazioni sul comportamento (ad esempio, chiuso, aperto, metà aperto) che funziona su dispositivi di più produttori.

Esempio di codice

L'angolo della cerniera può essere misurato usando il gestore sensori di Android configurato con il nome del sensore 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
        )
    }
}