Android/센서 | Posted by 덩치 2013. 11. 28. 16:33

TYPE_MAGNETIC_FIELD 센서로 방위각 구하기

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

가장 기본적이면서 중요한 메커니즘은 SensorEventListener 참조, onResume에서 딜레이 설정이다.


//먼저 액티비티에 SensorEventListener을 implements 해 준다.

public class MainActivity extends Activity implements SensorEventListener{

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);


float[] rotation = new float[9];  

float[] result_data = new float[3];

float[] mag_data = new float[3]; //센서데이터를 저장할 배열 생성 

float[] acc_data new float[3]; //가속도데이터값이 들어갈 배열. 각도를 뽑으려면 가속도와 지자계의 값이 있어야함.

크기가 3인 이유는 센서값 values의 index가 3이기때문(x.y.z)


SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE); //센서매니저 생성

mag_sensor = sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); //마그네틱 필드 센서 생성

}

//센서 읽어들이는 간격 설정(NORMAL < UI < GAME 순 속도)

protected void onResume(){

super.onResume();

sm.registerListener(this, mag_sensor, SensorManager.SENSOR_DELAY_UI);

}



@Override

public void onSensorChanged(SensorEvent event) {  //센서값 변경을 읽는 리스너

if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)   //센서가 읽어들인 값이 마그네틱필드일때

mag_data = event.values.clone();    //데이터를 모두 mag_data 배열에 저장

if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) // 가속도센서값일때

acc_data = event.values.clone();  //마찬가지

if (mag_data != null && acc_data != null) { //널체크    

       SensorManager.getRotationMatrix(rotation, null, acc_data, mag_data); //회전메트릭스 연산

             SensorManager.getOrientation(rotation, result_data); //연산값으로 방향값 산출

result_data[0] = (float)Math.toDegrees(result_data[0]); // 방향값을 각도로 변환

if(result_data[0] < 0) m_result_data[0] += 360; //0보다 작을경우 360을더해줌

}

}



//종료시에는 반드시 센서의 리스너를 해제해줘야함

public void onDestroy(){

super.onDestroy();

sm.unregisterListener(this);

}


}


빠진부분이나 의문사항 댓글로 남겨주면 답변드립니다.