안드로이드가 제공하는 센서 → 오준석의 안드로이드 생존코딩 책 234페이지
센서는 계속 사용시 배터리 소모가 많기에 앱을 사용할 때만 동작하도록 처리해야 한다.
이를 위해 onResume() 상태에서 센서를 등록하고 onPause()에서 해제해야 한다.
//onCreate() 위에 다음과 같이 sensorManager을 선언한다. //지연된 초기화를 이용하여 sensorManager 변수를 처음 사용할 때 //getSystemService()메서드로 SensorManager 객체를 얻는다. private val sensorManager by lazy { getSystemService(Context.SENSOR_SERVICE) as SensorManager } //onResume()을 override한다. override fun onResume() { super.onResume() sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL) } //registerListener메서드로 사용할 센서를 등록한다. //첫 번째 인자는 센서 값을 받을 SensorEventListener이다. //여기서는 this를 이용하여 액티비티에서 센서값을 받도록 한다. //그 다음 getDefaultSensor() 메서드로 사용할 센서 종류를 지정한다. //여기서는 Sensor 클래스에 상수로 정의된 가속도 센서를 지정했다. //세 번째 인자는 센서값을 얼마나 자주 받을지를 지정한다. //SensoeManager 클래스에 정의된 상수 중 하나를 선택한다. // - SENSOR_DELAY_FASTEST : 가능한 가장 자주 센서값을 얻는다. // - SENSOR_DELAY_GAME : 게임에 적합한 정도로 센서값을 얻는다. // - SENSOR_DELAY_NORMAL : 화면 방향이 전환될 때 적합한 정도로 센서값을 얻는다. // - SENSOR_DELAY_UI : 사용자 인터페이스를 표시하기에 적합한 정도로 센서값을 얻는다. //그리고 난 후 MainActivity가 SensorEventListener을 구형하도록 추가한다. class MainActivity : AppCompatActivity(), SensorEventListener //이렇게... 그리고 onAccuracyChanged(), onSensorChanged() 메서드를 구현한다. override fun onAccuracyChanged(p0: Sensor?, p1: Int) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } override fun onSensorChanged(event: SensorEvent?) { //센서값이 변경되면 호출됨 //values[0] : x축 값 : 위로 기울이면 -10~0, 아래로 기울이면 0~10 //values[1] : y축 값 : 왼쪽으로 기울이면 -10~0, 오른쪽으로 기울이면 0~10 //values[2] : z축 값 : 미사용 event?.let { Log.d("MainActivity", "onSensorChanged: x :" + " ${event.values[0]}, y : ${event.values[1]}, z : ${event.values[2]}") } } //onAccuracyChanged()는 센서 정밀도가 변경되면 호출된다. //onSensorChanged()는 센서값이 변경되면 호출된다. //오버라이드 시 인자값이 event가 아닌 p0처럼 의미 없는 이름으로 생성될 때는 compileSkdVersion과 //맞는 SDK의 소스를 내려받으면 된다. //모듈 수준의 build.gradel android { compileSdkVersion 27 } //액티비티가 동작 중일 때만 센서를 사용하려면 화면이 꺼지기 직전인 onPause() 메서드에서 센서를 //해제한다. //unregisterListener() 메서드로 센서 사용을 해제할 수 있으며 인자로 SensorEventListener //을 사용한다. MainActivity 클래스에서 이 객체를 구현중이므로 this를 지정한다. override fun onPause() { super.onPause() sensorManager.unregisterListener(this) } //일반적으로 센서 프레임워크에서 센서값을 나타내는데 x, y, z 표준 3축 좌표계를 사용한다. //기기를 정면으로 봤을 때 x축은 수평이며 오른쪽을 가르킴 //y축은 수직이며 위쪽을 가리키고 z축은 화면의 바깥쪽을 향한다. //이 좌표들은 다음 센서들에서 사용한다. // - 가속도 센서 // - 중력 센서 // - 자이로 스코프 // - 선형 가속도 센서 // - 자기장 센서 //센서는 SensorEvent객체로 값을 넘겨준다. //SensorEvenr.values[] 배열 객체에 센서값이 담겨있따. 가속도 센서를 사용 시 다음과 같이 값을 //얻을 수 있다. //SensorEvent.values[0] : x축 값 //SensorEvent.values[1] : y축 값 //SensorEvent.values[2] : z축 값 //values[0] : x축 값 : 위로 기울이면 -10~0, 아래로 기울이면 0~10 //values[1] : y축 값 : 왼쪽으로 기울이면 -10~0, 오른쪽으로 기울이면 0~10 //values[2] : z축 값 : 미사용