안드로이드 개발 질문/답변
(글 수 40,700)
방위각을 구하기 위해서 센서 사용 테스트 겸 아래와 같은 프로그램을 짰습니다.
x,y,z 세 값만 출력하기 위해 main.xml 에 TextView 세개를 두었구요.
숫자가 나오기는 하는데....
레퍼런스에 SensorEvent 부붙 찾아보면 value[0]은 방위각 [1]은 피치, [2]는 롤 이라고 되어있는데...
피치, 롤은 얼추 맞게 나오는것 같은데... 방위각이 영 이상하게 나오네요...
방위각이 폰을 바닥에 놓고 뱅뱅 돌리면 0~360 까지 변해야 한다고 생각하는데...
설명에도 0은 북 90는 동 180은 남 270은 서 라고 되어있는데...
이게 아무리 돌려도 270~360 정도밖에 움직이질 않습니다.
다운 받아뒀던 나침반 앱을 돌려봐도 그렇군요. 그런데 나침반 앱은 바늘은 방위를 제대로 표시하네요...ㅡㅡ;;;
제가 뭘 잘못했거나 빠뜨린게 있는지 한번만 봐주시고 조언해 주셨으면 합니다.
테스트에 사용중인 폰은 T-Mobile G1 이고 안드로이드 1.6 버전으로 짰습니다.
감사합니다.
-------------------------------------------------------------
package com.test;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
public class OrientationTest extends Activity {
/** Called when the activity is first created. */
private Toast msgToast;
private SensorManager sm;
private SensorEventListener smListener;
private TextView text_x;
private TextView text_y;
private TextView text_z;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text_x = (TextView)findViewById(R.id.axis_x);
text_y = (TextView)findViewById(R.id.axis_y);
text_z = (TextView)findViewById(R.id.axis_z);
sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
smListener = new testListener();
sm.registerListener(
(SensorEventListener) smListener,
sm.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_FASTEST);
}
@Override
protected void onStop() {
super.onStop();
sm.unregisterListener(smListener);
}
@Override
protected void onResume() {
super.onResume();
sm.registerListener(
(SensorEventListener) smListener,
sm.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onDestroy() {
super.onDestroy();
sm.unregisterListener(smListener);
}
// 여기 리스너를 재정의 해서 사용했습니다.
// 여기서 x,y,z 값을 받아 출력만 하는데... 왜 저런 희안한 결과가 나오는지 모르겠습니다.
private class testListener implements SensorEventListener{
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_ORIENTATION){
TextOut("in ORIENTATION");
text_x.setText(Float.toString(event.values[0]));
text_y.setText(Float.toString(event.values[1]));
text_z.setText(Float.toString(event.values[2]));
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
}
// 확인용 토스트를 사용하기 위한 함수.
public void TextOut(String str){
if(msgToast == null){
msgToast = Toast.makeText(OrientationTest.this, str, Toast.LENGTH_SHORT);
}else{
msgToast.setText(str);
}
msgToast.show();
}
}
================================================