Android Sensor 사용하기

Kotlin Android DEVELOPMENT IT

안드로이드가 제공하는 센서 → 오준석의 안드로이드 생존코딩 책 234페이지

센서는 계속 사용시 배터리 소모가 많기에 앱을 사용할 때만 동작하도록 처리해야 한다.
이를 위해 onResume() 상태에서 센서를 등록하고 onPause()에서 해제해야 한다.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//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축 값 : 미사용