Android Sensor 사용하기

Kotlin Android DEVELOPMENT IT

안드로이드가 제공하는 센서 → 오준석의 안드로이드 생존코딩 책 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축 값 : 미사용