티스토리 뷰



이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 - http://www.tipssoft.com/bulletin/tb.php/QnA/8406
* 관리자의 Tipssoft 이야기를 들어보세요 ( 트위터 ID : tipssoft )
* 안드로이드 강좌 목록 - http://www.tipssoft.com/bulletin/tb.php/old_bbs/501

안드로이드용 기기에는 가속 센서, 조도 센서, 온도 센서, 근접 센서 등 여러가지 에너지를 측정하여
수치데이터로 전달해주는 센서들이 내장되어 있습니다. 이러한 센서들로 인해서 자동으로 기기의
화면 밝기를 조절하는 기능을 구현하기도 하고, 가속 센서를 이용한 게임도 할 수 있습니다.
이번 강좌에서는 센서를 사용할 때 공통적으로 알아두어야 할 사항에 대하여 알아보도록 하겠습니다.
1. 센서 매니저 얻기
센서는 시스템이 관리하는 시스템 서비스이기때문에 시스템으로부터 SensorManager 객체를
얻어서 사용해야 합니다. SensorManager 객체는 센서에 접근할 수 있도록 도와주는 객체로
아래와 같이 getSystemService 메소드를 호출하여 얻을 수 있습니다.
SensorManager m_sensor_manager = (SensorManager)getSystemService(SENSOR_SERVICE);
센서 매니저는 다른 메소드에서 지속적으로 사용할 수 있기때문에 멤버 변수로 선언해주는 것이
좋습니다.
2. 센서 얻기
시스템 서비스로부터 얻은 센서 매니저를 이용하여 사용하고자 하는 Sensor 객체를 얻습니다.
Sensor m_light_sensor = m_sensor_manager.getDefaultSensor(Sensor.TYPE_LIGHT);
getDefaultSensor 메소드는 매개 인자가 의미하는 센서 중에서 디폴트로 설정된 Sensor 객체를
반환해줍니다. 기기에 따라서는 한 종류의 센서를 여러개 가질 수도 있기때문에 해당 메소드를
사용하여 Sensor 객체를 얻는 것입니다. 이 메소드에서 얻을 수 있는 센서의 종류와 매개 인자에
명시해야할 Sensor 클래스의 필드 값은 아래와 같습니다.
방향센서를 사용하는 경우 TYPE_ORIENTATION 를 통해서 방향값을 직접 얻는 것보다
SensorManager.GetOrientation() 을 이용하여 방향값을 얻는 방법을 권장하고 있습니다.
3. 리스너 구성하기
센서는 센서가 감지할 수 있는 에너지를 수치값으로 변환하여 제공하는 독립적인 장비이므로
컨텍스트에서 센서 값을 얻기위해서는 센서가 전달해주는 값을 전달받기위한 SensorEventListener
리스너를 구성하여 등록해야 합니다.
SensorEventListener 리스너에는 아래와 같은 두개의 메소드를 가집니다.
3.1 abstract void onAccuracyChanged(Sensor sensor, int accuracy)
기기의 정확도가 변경되면 호출되는 메소드입니다. sensor 는 정확도가 변경된 센서를 의미하며
accuracy 는 현재 기기의 정확도를 의미합니다. 정확도는 3개의 값으로 나뉘며 SensorManager
클래스에 필드값으로 아래와 같이 정의되어 있습니다.
- SENSOR_STATUS_ACCURACY_HIGH 정확도 높음
- SENSOR_STATUS_ACCURACY_MEDIUM 정확도 중간
- SENSOR_STATUS_ACCURACY_LOW 정확도 낮음
- SENSOR_STATUS_UNRELIABLE 신뢰할 수 없음
센서의 경우 정확도가 거의 변경되지 않기때문에 이 메소드에 대한 고려는 하지 않아도 됩니다.
3.2 abstract void onSensorChanged(SensorEvent event)
센서에서 측정한 데이터 값이 넘어오는 메소드입니다. 데이터값은 SensorEvent 객체로 구성되어
전달되는데 이 객체는 내부 시스템에서 재사용될 수 있기때문에 어플리케이션에서 소유하거나
잡고 있어서는 안됩니다. SensorEvent 객체로 전달되는 데이터는 다음과 같습니다.
- int accuracy 센서 측정값의 정확도
- Sensor sensor 결과 값을 보내준 센서 객체
- long timestamp 센서가 데이터를 측정한 시간
- float[] values 센서가 측정한 데이터값. 센서 종류에 따라서 배열의 크기가 달라짐
4. 리스너 등록하기
센서는 센서가 감지할 수 있는 에너지를 수치값으로 변환하여 제공하는 독립적인 장비이므로
컨텍스트에서 센서 값을 얻기위해서는 센서가 전달해주는 값을 전달받기위한 리스너를 등록해야
합니다. 리스너를 등록하는 일 역시 센서매니저가 수행해야하며 해당 함수의 원형은 아래와 같습니다.
boolean registerListener(SensorEventListener listener, Sensor sensor, int rate);
listener 에는 해당 센서가 호출할 메소드들이 정의된 SensorEventListener 인터페이스 객체를 명시하고,
sensor 에는 2 번 항목에서 얻은 Sensor 객체를 명시하며, rate 에는 해당 센서의 데이터를 얼마나
자주 갱신할 것인지 명시합니다. rate 에 명시할 수 있는 SensorManager 클래스의 필드 값은 아래의
표와 같습니다.
메인 액티비티에서 SensorEventListener 인터페이스를 직접 구현한다고 했을 때 registerListener
메소드는 다음과 같이 구현할 수 있습니다.
m_sensor_manager.registerListener(this, m_light_sensor, SensorManager.SENSOR_DELAY_UI);
5. 리스너 해제하기
더이상 센서의 데이터를 받아야할 필요가 없다면 등록한 리스너를 해제하여 기기의 부하를 줄여
주어야합니다. 리스너를 해제할 때에는 unregisterListener 메소드를 사용하며 해당 함수의 원형은
아래와 같습니다.
void unregisterListener (SensorEventListener listener);
listener 에는 등록시 명시했던 인터페이스 객체를 동일하게 명시해주면 됩니다. 메인 액티비티에
SensorEventListener 인터페이스를 구현했다면 아래와 같이 사용할 수 있을 것입니다.
m_sensor_manager.unregisterListener(this);
※ 액티비티에서는 포커스를 얻는 시점인 onResume 메소드에서 리스너를 등록하고, 포커스를
잃는 시점인 onPause 메소드에서 리스너를 해제해야 효율적으로 사용할 수 있습니다.


댓글