ほとんどの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) }}