펌 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);
}
}
빠진부분이나 의문사항 댓글로 남겨주면 답변드립니다.
'Android > 센서' 카테고리의 다른 글
기본적인 센서(Sensor) 사용법 (1) | 2014.01.07 |
---|---|
안드로이드 TYPE_ACCELEROMETER 센서로 가속도 구하기 (3) | 2013.11.28 |