簡単にわかりたい人向き。
Androidのセンサーを扱うためにはSensorManagerから必要なセンサーのオブジェクトを取得し、センサーの値をコールバックさせるためにイベントリスナーを実装すればいい。
ここではMainActivityにコールバックさせるため、SensorEventListenerのインターフェースを継承させている。
そうするとAndroid Studioの機能で自動的にoverrideしなければならないメソッドを挿入してくれるので挿入する。挿入されるメソッドはonSensorChangedとonAccuracyChangedの二つ。前者はセンサーの数値が変わったときなどに呼ばれる。後者はセンサーの精度が変わったときに呼ばれるが、ほぼ使うことはないようだ。
センサーマネージャーとセンサーオブジェクトはonCreateでインスタンスを生成している。
ライフサイクルがあるので画面が表示されている時だけ取得し、バックグラウンドでは動かさないようにするためにはonResumeとonPauseでイベントリスナーの登録を解除したり、再度イベントリスナーを登録したりする必要がある。
数値はonSensorChangedの引数であるeventのvalueの中に入っている。このvalueは配列になっているので、複数の数値が戻ってくる場合は、このvalueを中身をみてあげる必要がある。
Androidのセンサーを扱うためにはSensorManagerから必要なセンサーのオブジェクトを取得し、センサーの値をコールバックさせるためにイベントリスナーを実装すればいい。
ここではMainActivityにコールバックさせるため、SensorEventListenerのインターフェースを継承させている。
そうするとAndroid Studioの機能で自動的にoverrideしなければならないメソッドを挿入してくれるので挿入する。挿入されるメソッドはonSensorChangedとonAccuracyChangedの二つ。前者はセンサーの数値が変わったときなどに呼ばれる。後者はセンサーの精度が変わったときに呼ばれるが、ほぼ使うことはないようだ。
センサーマネージャーとセンサーオブジェクトはonCreateでインスタンスを生成している。
ライフサイクルがあるので画面が表示されている時だけ取得し、バックグラウンドでは動かさないようにするためにはonResumeとonPauseでイベントリスナーの登録を解除したり、再度イベントリスナーを登録したりする必要がある。
数値はonSensorChangedの引数であるeventのvalueの中に入っている。このvalueは配列になっているので、複数の数値が戻ってくる場合は、このvalueを中身をみてあげる必要がある。
class MainActivity : AppCompatActivity(), SensorEventListener {
private var mManager: SensorManager by Delegates.notNull<SensorManager>()
private var mSensor: Sensor by Delegates.notNull<Sensor>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//センサーマネージャーを取得する
mManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
//加速度計のセンサーを取得する
//その他のセンサーを取得する場合には引数を違うものに変更する
mSensor = mManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
}
//センサーに何かしらのイベントが発生したときに呼ばれる
override fun onSensorChanged(event: SensorEvent?) {
//3つの値が配列で入ってくる
Log.v("nullpo", "______")
//X軸方法
Log.v("nullpo", event?.values!![0].toString())
//Y軸方法
Log.v("nullpo", event?.values!![1].toString())
//Z軸方法
Log.v("nullpo", event?.values!![2].toString())
}
//センサー精度が変更されたときに発生するイベント
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
}
//アクティビティが閉じられたときにリスナーを解除する
override fun onPause() {
super.onPause()
//リスナーを解除しないとバックグラウンドにいるとき常にコールバックされ続ける
mManager.unregisterListener(this)
}
override fun onResume() {
super.onResume()
//リスナーとセンサーオブジェクトを渡す
//第一引数はインターフェースを継承したクラス、今回はthis
//第二引数は取得したセンサーオブジェクト
//第三引数は更新頻度 UIはUI表示向き、FASTはできるだけ早く、GAMEはゲーム向き
mManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_UI)
}
}