2012-03-12 5 views
5

그래서 안드로이드 기반 전화가 틸트 기반 프로그램을위한 x, y, z 방향으로 회전했을 때 나는 방향을 찾기 위해 자력과 가속을 사용하는 잘 순환 된 코드를 사용했는지 알아야했습니다. 방향 탐지기가 신뢰할 수 없기 때문에 이것은 x, z 평면에서 잘되고 좋았지 만 사용자가 고정 된 가로 위치에서 휴대 전화를 들고 순환 이동하는 버스에 있었고 사용자가 y 방향 이동을 등록한 경우에도 안드로이드는 y 방향 움직임을 등록합니다 didnt는 y 방향으로 자신의 휴대폰을 이동하므로 프로그램이 실패하지만 단지 혼자서도 isn/t 정확도를 사용하지 않고 사용자와 관련된 y- 움직임을 감지하는 문제를 해결하는 방법을 궁금합니다.안드로이드 방향 탐지 피부

public class MotionListener { 
     String service_name = Context.SENSOR_SERVICE; 
     SensorManager sensorManager; 
     Sensor sensor; 

     public MotionListener(Context context) { 
      sensorManager = (SensorManager) context.getSystemService(service_name); 
      SensorManager sm = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); 
      Sensor aSensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
      Sensor mfSensor = sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
      sm.registerListener(myAccelerometerListener, aSensor, SensorManager.SENSOR_DELAY_GAME); 
      sm.registerListener(myMagneticFieldListener, mfSensor, SensorManager.SENSOR_DELAY_GAME); 
     } 

     float[] accelerometerValues; 
     float[] magneticFieldValues; 
     final SensorEventListener myAccelerometerListener = new SensorEventListener() { 
      public void onSensorChanged(SensorEvent sensorEvent) { 
       if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
        accelerometerValues = sensorEvent.values; 
       float[] values = new float[3]; 
       float[] R = new float[9]; 
       try { 
        SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticFieldValues); 
        SensorManager.getOrientation(R, values); 
        values[0] = (float) ((float) values[0] * 180/Math.PI); 
        values[1] = (float) ((float) values[1] * 180/Math.PI); 
        values[2] = (float) ((float) values[2] * 180/Math.PI); 
        System.out.println((int)values[0] + " " + (int)values[1] + "  " + (int)values[2]); 
        setTiltCoordinates(values); 
       } catch (NullPointerException e) { 
       } 
      public void onAccuracyChanged(Sensor sensor, int accuracy) { 
      } 
     }; 
+3

불가능 - 사용자의 방향을 기기에 제공하지 않음 - 완전히 다른 질문입니다. – KevinDTimm

+0

아니요. 그것을 할 수 없습니다. [참조 프레임] (http://en.wikipedia.org/wiki/Frame_of_reference) 등. 사용자로서 이러한 조건에서 이러한 응용 프로그램을 사용하려고 시도하는 것은 어쨌든 무의미한 연습입니다. – Cheezmeister

+0

+1 나는 똑같이 찾고있다. – Sameer

답변

4

가속도계 데이터 만보고 있으면 x, y 및 z 방향으로 세 값이 있습니다. 이것들 중 하나는 가장 큰 당김을 가질 것이고, 당신은 이것이 '아래'방향이라는 것을 의미하기 위해 보통 이것을 취할 수 있습니다.

사용자가 현장에서 회전하여 중력에 의한 것이 아닌 가속도를 느끼게하는 등 움직임에 문제가있을 수 있습니다.이 정도면 충분하다면 '아래'방향으로 보일 수도 있습니다. , 얼마나 오래, 당신은 하나의 가속도를 만들 정도로 충분히 빠르게 회전해야 할 것인데, 나는 버스가 할 수있을 지 의심 스럽다.

다음 큰 문제는 x, y 및 z 데이터 값이 각 핸드셋이 다르게 방향을 지정할 수있는 세 개의 수직 축에 불과하다는 것입니다. 한 전화기에서 'y'(일반적으로 위아래 축으로 간주되는)는 화면을 통해있을 수 있으며 화면은 zx 평면에있을 수 있습니다. 다른 휴대 전화는 화면을 비스듬히 기울어 야 할 수도 있습니다.

가속도계 데이터만으로는 휴대 전화의 방향을 알 수 없습니다. 하지만 Android SDK가 이것을 고려하고 모든 휴대 전화가 동일한 데이터를 볼 수 있도록 실제 가속도계 데이터를 '조정'합니다.

+0

나는 분명히해야했다. 앱은 기울이기를 통해 물건을 움직인다. 사용자가 서쪽으로 개체를 영구적으로 이동하려는 경우 가속이 유일한 센서 인 경우 휴대폰을 계속 펌핑해야합니다. 이것은 작동하지 않습니다. –

+0

당신은 평평하게 고정되어있는 동안 전화기에서 볼을 기울여야하는 것처럼 당신이 원하는 것을 의미합니다 ... – thecoshman

+0

아니면 축을 중심으로 방향 데이터를 원합니까? –