センサーを使う

ほとんどのAndroid端末には加速度計、ジャイロスコープ等のセンサーが搭載されています。端末によってはこれら以外にも様々なセンサーが搭載されています。

Androidで利用できるセンサーの種類はこのページの "表 1. Android プラットフォームでサポートされているセンサータイプ" を参照してください。

センサーのモニタリング

センサーの測定データをモニタリングするには、ActivityにSensorEventListenerインターフェースを継承し、

onSensorChanged() => センサーの値が更新されたときのメソッド

onAccuracyChanged() => センサーの精度が変更されたときのメソッド

の2つを実装する必要があります。

さらに、使用するセンサーの管理のためSessionManagerクラスを利用します。

val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager

次に、Sensor.TYPE_XXX(使用したいセンサー)を引数にしてgetDefaultSensor()メソッドを呼ぶことでセンサーを指定します。

val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY)

最後にモニタリングの開始、停止の実装が必要です。onResume()、onPause()メソッドを使用することで、Activityが表示されているときのみモニタリングをするようにできます。

override fun onResume() {
    super.onResume()
    sensor.also {
        sensorManager.registerListener(this, it, SensorManager.SENSOR_DELAY_NORMAL)
    }
}

override fun onPause() {
    super.onPause()
    sensorManager.unregisterListener(this)
}

重力センサーの値を表示するサンプルコード

class MainActivity : AppCompatActivity(), SensorEventListener {
    private lateinit var sensorManager: SensorManager
    private var mGravity: Sensor? = null
    private lateinit var sensorX: TextView
    private lateinit var sensorY: TextView
    private lateinit var sensorZ: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
        mGravity = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY)

        sensorX = findViewById(R.id.sensorX)
        sensorY = findViewById(R.id.sensorY)
        sensorZ = findViewById(R.id.sensorZ)
    }

    override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
    }

    override fun onSensorChanged(event: SensorEvent) {
        sensorX.text = event.values[0].toString()
        sensorY.text = event.values[1].toString()
        sensorZ.text = event.values[2].toString()
    }

    override fun onResume() {
        super.onResume()
        mGravity.also {
            sensorManager.registerListener(this, it, SensorManager.SENSOR_DELAY_NORMAL)
        }
    }

    override fun onPause() {
        super.onPause()
        sensorManager.unregisterListener(this)
    }
}