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축에 적용되는 힘

예를 들어
  • 단말의 왼쪽 측면을 오른쪽 방향으로 눌렀을때 X 가속도 값은 음수를 나타냅니다.
  • 단말에 테이블위에 평평하게 놓여있을때 -STANDARD_GRAVITY 값, 즉 -9.8 (m/s2) 을 가집니다. 단말이 테이블에서 중력에 대한 반작용으로 적용되는 힘을 나타냅니다. 

    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

    + Recent posts