본문 바로가기
Kotlin

Kotlin - 안드로이드 내장센서 사용하기

by 봄석 2019. 1. 4.
안드로이드 내장 센서 사용하기


안드로이드 내장 센서 종류(Sensor 클래스)
Type센서설명
intTYPE_ACCELEROMETER1가속도 감지, 외부의 충격량과 방향 감지 센서
intTYPE_ALL-1모든 센서
intTYPE_AMBIENT_TEMPERATURE13주위 온도 감지 센서
intTYPE_GAME_ROTATION_VECTOR15보정되지 않은 회전 벡터 센서
intTYPE_GEOMAGNETIC_ROTATION_VECTOR20지자기 회전 벡터
intTYPE_GRAVITY9축의 방향과 중력 감지
intTYPE_GYROSCOPE4회전 정보 감지, 다양한 축의 회전각 감지
intTYPE_LIGHT5빛의 세기 감지 센서
intTYPE_MAGNETIC_FIELD2자기장 센서
intTYPE_MOTION_DETECT30움직임 감지 센서
intTYPE_ORIENTATION3방향각 감지 센서
intTYPE_PRESSURE6압력 센서
intTYPE_PROXIMITY8근접한 물체와의 거리 감지 센서
intTYPE_RELATIVE_HUMIDITY12상대 습도 센서
intTYPE_ROTATION_VECTOR11회전 벡터 센서
intTYPE_SIGNIFICANT_MOTION17중요한 모션 트리거 센서
intTYPE_STEP_COUNTER19발걸음 횟수 센서
intTYPE_STEP_DETECTOR18발걸음 감지 센서
intTYPE_TEMPERATURE7온도 감지. API level 14에서 사용


센서 사용 준비

1) SensorManager 인스턴스를 얻습니다.

2) 위 표에 있는 센서 중 하나를 getDefaultSensor() 메소드에 지정하여 Sensor 객체를 얻습니다.

3) onResume() 메소드에서 registerListener() 메소드로 센서의 감지를 등록합니다

4) onPause() 메소드에서 unregisterListener() 메소드로 센서 감지를 해제합니다.





1)SensorManager 인스턴스 얻기

class MainActivity : AppCompatActivity(),SensorEventListener {
 
    private val sensorManager by lazy {
        getSystemService(Context.SENSOR_SERVICE) as SensorManager  //센서 매니저에대한 참조를 얻기위함
    }                                                              // getSystemService() 메소드에 SENSOR_SERVICE 상수를 전달하여
                                                                   // SensorManager클래스의 인스턴스를 만듭니다.
 
    override fun onCreate(savedInstanceState: Bundle?) {
        ....
    }
}
 




지연된 초기화를 사용하여 sensorManager 변수를 처음 사용할 때 getSystemService() 메소드로 SensorManager 객체를 얻습니다.



2)센서중 하나를 지정하여 onResume에 등록하기

override fun onResume() {
        super.onResume()
        sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_NORMAL
            )
    }


SensorManager 객체가 준비되면 액티비티가 동작할 때만 센서가 동작해야 배터리를 아낄 수 있습니다. 일반적으로 센서의 사용등록은 액티비티의 onResume() 메소드에서 수행합니다.

자동 완성 기능을 사용하여 onResume() 메소드를 오버라이드해 위와같이 센서등록하는 코드를 작성합니다.


1)registerListener() 메소드로 사용할 센서를 등록합니다.

첫 번째 인자는 센서 값을 받을 SensorEventListener 입니다. 여기서는 this를 지정하여 액티비티에서 센서값을 받도록합니다.

2) 두 번째 인자로 sensorManager의 getDefaultSensor() 메소드로 사용할 센서 종류를 지정합니다.(가속도센서를 지정)

3) 세 번째 인자는 센서값을 얼마나 자주 받을지 지정합니다. SensorManager 클래스에 정의된 상수를 사용합니다


 - SENSOR_DELAY_FASTEST : 가능한 가장 자주 센서값을 얻습니다

 - SENSOR_DELAY_GAME : 게임에 적합한 정도로 센서값을 얻습니다.

 - SENSOR_DELAY_NOMAL : 화면 방향이 전환될 때 적합한 정도로 센서값을 얻습니다.

 - SENSOR_DELAY_DELAY_UI : 사용자 인터페이스를 표시하기에 적합한 정도로 센서를 얻습니다.


너무 빈번하게 되면 시스템리소스를 낭비하고 전원을 사용하기 때문에. SENSOR_DELAY_NOMAL 을 사용했습니다.



메인엑티비티에는 SensorEventListener를 인터페이스를 구현하도록 추가하고

아래 두 메소드를 오버라이드 합니다.

- onAccuracyChanged() : 센서 정밀도가 변경되면 호출됩니다.

- onSensorChanged() : 센서 값이 변경되면 호출됩니다



3)센서 해제 액티비티가 동작 중일때만 센서를 사용하려면 화면이 꺼지기 직전인 onPause() 메소드에서 센서를 해제합니다.

override fun onPause() {
        super.onPause()
        sensorManager.unregisterListener(this)
    }


unregisterListener() 메소드를 이용하여 센서 사용을 해제할 수 있으며 인자로 SensorEventListene 객체를 지정합니다. 여기서는 MainActivity에서 구현하고 있으므로 this를 넣었습니다.









가속도센서

안드로이드 센서 프레임워크에서는 x, y, z 표준 3축 좌표계를 사용하며

x축은 수평, y축은 수직, z 축은 화면의 바깥쪽을 향하게 됩니다


이 좌표는 가속도 센서뿐 아니라

- 중력센서

- 자이로스코프

- 선형 가속도 센서

- 자기장 센서 

등에서 사용됩니다.


센서값을 읽어올때는 

SensorEvent.values[0] : x축 값
SensorEvent.values[1] : y축 값

SensorEvent.values[2] : z축 값


위와같이 읽을 수 있습니다

댓글