API de capteur d’angle de charnière

L’angle de la charnière est une valeur comprise entre 0 et 360 :

  • 0 - l’appareil est fermé (les écrans se font face et ne sont pas visibles)
  • 90 - l’appareil forme un « L », également appelé position ordinateur portable ou position livre en fonction de l’orientation
  • 180 - l’appareil est plat
  • 360 - l’appareil est plié de sorte que les écrans sont à l’opposé l’un de l’autre et seul un écran fonctionne

Conseil

Cet exemple de code est écrit pour le capteur d’angle de charnière sur Surface Duo.

Le Gestionnaire de fenêtres Jetpack dispose d’une DeviceState API qui fournit des informations sur la posture (par exemple, fermée, ouverte, semi-ouverte) qui fonctionne sur les appareils de plusieurs fabricants.

Exemple de code

L’angle de la charnière peut être mesuré à l’aide du Gestionnaire de capteurs Android configuré avec le nom de capteur 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
        )
    }
}