1. 센서 관리자
센서 관리자는 안드로이드 장치에서 이용할 수 있는 센서 하드웨어를 관리하는 데 사용
센서 레퍼런스를 얻는 법
String service_name = Context.SENSOR_SERVICE;
SensorManager sensorManager = (SensorManager)getSystemService(service_name);
다음 보인 패턴은 이용할 수 있는 모든 하드웨어 센서로부터의 센서 결과를 모니터 하는 데 이용할 수 있다.
SensorListener mySensorListener = new SensorListener() {
Public void onSensorChanged(int sensor, float[] values){
// 센서 값 변화를 다룬다.
}
Public void onAccracyChanged(int sensor, int accuracy){
//정확도의 변화를 다룬다.
}
};
센서의 정확도 변화를 보려면 onAccracyChanged을 구현해야 한다. Accuracy 매개변수는 다음과 같은 상수 이다.
SensorManager.SENSOR_STATUS_ACCURACY_HIGH 센서가 가능한 가장 높은 정확도
SensorManager.SENSOR_STATUS_ACCURACY_LOW 센서가 가능한 가장 낮은 정확도
SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM 센서가 가능한 가장 높은 정확도
SensorManager.SENSOR_STATUS_UNRELIABLE 센서 데이터를 신뢰할 수 없음을 나타내며, 조정이필요하거나 현재 측정이 불가능함
SensorManager.SENSOR_ACCELEROMETER 현재 가속도를 세 축을 따라 제곱 초당 미터(m/s2)로 리턴하는 가속도 센서.
SensorManager.SENSOR_ORIENTATION 세 축에 대한 현재 방향을 도 단위로 리턴하는 방향센서
SensorManager.SENSOR_LIGHT 주변 조도를 럭스로 기술한 단일 값을 리턴하는 주변 광 센서
SensorManager.SENSOR_MAGNETIC_FIELD 현재 자기장을 세 축을 따라 마이크로테슬라로 측정하는 데 사용되는 센서
SensorManager.SENSOR_PROXIMITY 장치와 대상 물체 간의 거리를 미터로 기술한 단일 값을 리턴하는 근접 센서
SensorManager.SENSOR_TEMPERATURE 주변 온도를 섭씨로 리턴하는 온도 센서
특정 센서로부터의 변화를 통지받으려면, 센서 리스너를 만들고, 이 리스너로 트리거 해야하는 센서와 센서의 업데이트 속도를 지정하는 센서 관리자에 이를 등록한다.
sensorManager.registerListener(mySensorListener, SensorManager.SENSOR_TRICORDER, SensorManager.SENSOR_DELAY_FESTEST);
업데이트 속도 관련 상수
SensorManager.SENSOR_DELAY_FESTEST 가장 빠른 업데이트 속도
SensorManager.SENSOR_DELAY_GAME 게임 제어에 가장 적합한 업데이트 속도
SensorManager.SENSOR_DELAY_NORMAL 기본 업데이트 속도
SensorManager.SENSOR_DELAY_UI UI 기능 업데이트에 적합한 속도
sensorManager.registerListener(mySensorListener, SensorManager.SENSOR_TRICORDER); // default NORMAL
2. 가속도 센서와 나침반 이용하기
- 하드웨어의 현재 방향 측정
- 방향 변화 모니터
- 사용자가 향하고 있는 방향 식별
- 위 – 아래, 좌 – 우, 앞 – 뒤 방향 가속도(이동 속도의 변화) 모니터
Accelerometer는 가속도를 측정하는데 이용된다.
가속도는 속도의 변화 비율로 정의되므로, 가속도 센서는 장치의 속도가 주어진 방향에서 얼마나 빨리 변화하고 있는지를 측정할 수 있고, 사용자의 움직임과 이 움직임의 속도 변화 비율을 감지 할 수 있다.
주의) 가속도 센서는 속도를 측정하지 않는다 그래서 속도를 측정하려면, 시간에 대한 가속도의 변화를 측정해야 할 필요가 있다.
가속도 센서는 움직임에 기인한 가속도와 중력에 기인한 가속도 간을 구분하지 못한다. 따라서 Z축에 대한 가속도를 감지하는 가속도 센서는 정지 상태에 있을 때 -9.8m/s2 을 읽을 것이다.(이 값은 SensorManager.STANDARD_GRAVITY 상수)
가속도 변화 감지하기
가속도는 앞-뒤(세로 Longitudinal), 좌-우(가로 Lateral), 위-아래(수직 Vertical) 이렇게 세 방향 축을 따라 측정될 수 있다.
수직 양의 값은 위, 음의 값은 아래
세로 양의 값은 앞, 음의 값은 뒤
가로 양의 값은 오른쪽, 음의 값은 왼쪽
좌표 축 정의
X축 : 화면에 수평축(portrait 모드에서 짧은 에지를 landscape 모드에서 긴 에지)을 나타내며 오른쪽을 가리킨다.
Y축 : 화면에 수직축을 나타내며 화면 위쪽을 가리킨다.(원점은 왼쪽 밑 코너)
Z축 : 단말이 화면을 위로 해서 테이블에 올려져 있다고 생각했을 때 하늘을 가리킨다.
Orientation (Portrait, Landscape)이 바뀌었을 때 좌표값 역시 바뀐다는 것을 기억해야 합니다. 바뀌지 않은 값을 사용하기 위해서는 배열의 3, 4, 5번째 값을 가져올 수 있습니다.
SensorManager sm = (SensorManager)getSystemServie(Context.SENSOR_SERVICE);
Sm.registerListener(mySensorListener,
SensorManager.SENSOR_ACCELEROMETER,
SensorManager.SENSOR_DELAY_UI);
SensorListener mySensorListener = new SensorListener() {
Public void onSensorChanged(int sensor, float[] values){
// 센서 값 변화를 다룬다.
If(sensor == SenSorManager.SENSOR_ACCELEROMETER) {
Float xAxis = values[SensorManager.DATA_X]; // 앞 – 뒤
Float yAxis = values[SensorManager.DATA_Y]; // 좌 – 우
Float zAxis = values[SensorManager.DATA_Z];//
Float raw_xAxis = values[SensorManager.RAW_DATA_X];
Float raw_yAxis = values[SensorManager.RAW_DATA_Y];
Float raw_zAxis = values[SensorManager.RAW_DATA_Z];
}
}
};
Orientation
SENSOR_ORIENTATION (방향 센서)
각 배열의 값은 각도를 나타냅니다.
단말기 화면이 하늘을 향한 상태로 테이블 위에 수평으로 놓여있는 상태를 기준으로 각 축을 중심으로 회전시키는 것을 생각하면 됩니다.
values[0] : Z 축을 중심으로 회전 (0 <= azimuth < 360)
0 = 북, 90 = 동, 180 = 남, 270 = 서
values[1] : X축을 중심으로 회전 (-180 <= pitch <= 180)
Z축이 Y축 방향으로 향하면 0보다 큰값
화면이 하늘을 향하고 테이블위에 수평으로 놓여있는 상태 0, 화면이 아래를 향하면 -180 or 180,
똑바로 세우면 -90, 거꾸로 세우면 +90
values[2] : Y축을 중심으로 회전 (-90 <= roll <= 90)
Z축이 X축 방향으로 향하면 0보다 큰값
Accelerometer
SENSOR_ACCELOROMETER (가속도 센서)
각 배열의 값은 (m/s2) 단위로 되어있으며, 접촉힘(Contact Force)을 측정합니다.
values[0] : X축에 적용되는 힘
values[1] : Y축에 적용되는 힘
values[2] : Z축에 적용되는 힘
예를 들어
Mgnetic field
SENSOR_MAGNETIC_FIELD (자기장 센서)
모든 값은 micro-Tesla (uT) 단위로 되어있으며, X, Y, -Z 축 주변 자기장을 측정합니다.
참고 사이트
http://blog.androgames.net/85/android-accelerometer-tutorial/
http://blog.androgames.net/135/android-orientation-tutorial/
출처 : http://pheadra.tistory.com/category/Android/Android%20Service
'안드로이드' 카테고리의 다른 글
상태바(Status Bar) (0) | 2011.01.27 |
---|---|
PowerManager (0) | 2011.01.27 |
Notification Manager (0) | 2011.01.27 |
Android: gdb를 이용한 Dalvik VM 디버깅 (0) | 2011.01.27 |
서비스를 부팅시 시작시키기 (Start Service at Boot Time) (0) | 2011.01.27 |