2013-03-25 6 views
2

나는 장치의 나침반 각도를 파일에 기록하는 안드로이드 응용 프로그램을 만들고 있습니다.임의의 값을 반환하는 안드로이드 자력계

방법 1 :

SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
Sensor orientationSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); 
mSensorManager.registerListener(this, orientationSensor, SensorManager.SENSOR_DELAY_NORMAL); 


public void onSensorChanged(SensorEvent event) { 
    float azimuthInDegrees = event.values[0] 
} 

방법 2 : 나는 북쪽 방향으로 내 장치를 배치하여 두 가지 방법을 시도

SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
Sensor accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
Sensor magnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
mSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_NORMAL); 

float[] mGravity; 
float[] mGeomagnetic; 

public void onSensorChanged(SensorEvent event) { 
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
     mGravity = event.values; 
    } 


    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { 
     mGeomagnetic = event.values; 
    } 

    if (mGravity != null && mGeomagnetic != null) { 
     float R[] = new float[9]; 
     float I[] = new float[9]; 
     boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic); 
     if (success) { 
      float orientation[] = new float[3]; 
      SensorManager.getOrientation(R, orientation); 

      float azimuthInDegress = ((float) Math.toDegrees(orientation[0]) + 360) % 360; 
     } 
    } 
} 

이 메소드이 학위를 얻을 수 있습니다 (약 360도) :

방법 1 반환 완벽한 결과를하지만 불행히도이 방법은 사용되지 않습니다 :

  • 359.6567
  • 359.5034
  • 359.859
  • 359.76212
  • 359.8878
  • 359.87048
  • 359.8356
  • 359.80356
  • 359.81192
  • 359.7671
  • 359.84668
  • 359.88528

방법 2도 좋은 결과를 반환하지만 가끔 (무작위로) 그것은 잘못된도 반환

  • 359.91495
  • 을 359.83652
  • 263.67697
  • 359.67993 359.70038
  • 359.688
  • 359.71155 359.70276
  • 359.6984 359.6429
  • 270.6323
  • 359.62302 01,234,709

당신이 볼 수 있듯이 359.4947

  • 359.39572
  • 359.47803
  • 359.44757
  • 359.49954
  • 일부 잘못도 무작위로 두 번째 방법으로 반환됩니다.장치가 보정되었고 첫 번째 방법이 완벽한 결과를 반환하기 때문에 문제는 두 번째 방법과 같다고 생각합니다. 너희들이 나를 도와 줄 수 있니?

    +0

    이러한 결과를 얻을 때 어떤 위치가 장치입니까? 예를 들어 장치를 똑바로 들고있는 것. –

    +0

    나는 그것을 내 손에 들고있다. 거의 평평한 – user1135357

    +0

    그냥 바꾸시겠습니까? = event.values ​​to event.values.clone() 지금은 여전히 ​​동일한 동작을하는지보십시오. –

    답변

    3

    mGravitymGeomagnetic의 문제는 event.values.clone()이어야합니다. mGravity에는 클래스 범위가 있지만 mGravity = event.values를 사용하여 메서드 범위가있는 주소의 값에 해당 값을 할당합니다. 따라서 onSensorChanged가 다시 호출되고 마그네틱 유형 인 즉시, mGravity는 더 이상 존재하지 않으므로 어떤 값도 가질 수있는 변수를 가리 킵니다.

    관련 문제