힌지 각도 센서 API

힌지 각도는 0에서 360 사이의 값입니다.

  • 0 - 디바이스가 닫힘(화면이 서로 마주보고 보이지 않음)
  • 90 - 디바이스가 "L"자 모양이며 방향에 따라 랩톱 상태 또는 책 상태라고도 함
  • 180 - 디바이스가 평면이 됨
  • 360 - 화면이 서로 반대쪽을 향하고 하나의 화면만 작동하도록 디바이스가 접힘

이 코드 샘플은 Surface Duo의 힌지 각도 센서용으로 작성되었습니다.

Jetpack Window Manager에는 여러 제조업체의 디바이스에서 작동하는 포스처(예: 닫힘, 열림, 반 열림)에 대한 정보를 제공하는 DeviceState API가 있습니다.

코드 예제

힌지 각도는 Hinge Angle 센서 이름으로 구성된 Android의 센서 관리자를 사용하여 측정할 수 있습니다.

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
        )
    }
}