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 a une API qui fournit des informations sur la position (par exemple, fermé, ouvert, demi-ouvert) 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
        )
    }
}