2012-09-04 2 views
3

나는 코드를 다음과 같이 구현 :안드로이드 OnSensorChanged() 느린 응답

//register sensor in OnResume 
    mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_UI); 
    mSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_UI); 

    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); 

      azimuth = (int)(Math.toDegrees(orientation[0]) + 0.5); // orientation contains: azimuth, pitch and roll 
      pitch = (int)(Math.toDegrees(orientation[1]) + 0.5); 
      roll = (int)(Math.toDegrees(orientation[2]) + 0.5); 

      // output azimuth, pitch and roll 
     } 
    } 
} 

위의 코드는 갤럭시 넥서스 셀에서 잘 작동하지만 넥서스 태블릿의 문제 (방위각, 피치와 롤되는의 갱신이있다 잘 응답하지 않고, 때때로 5-8 초 걸린다).

OnSensorChanged() 호출이 제대로 작동하는지 확인했지만 "if (성공)"테스트가이 문제를 일으키는 경우 항상 성공한 것은 아닙니다.

갤럭시 넥서스, 거짓과 진실의 속도에서
  • 약 1 :

    나는 출력하여 부울 변수 "성공"을 테스트 한. 넥서스 타블렛
  • 거짓 진정한 속도가 많이 다르며, 높은 수 있듯이> 20 : 1

어떤 도움이 많이 받고있다.

+1

문제는 다음과 같은 코드가있다 : 경우 ((event.sensor.getType) == Sensor.TYPE_ACCELEROMETER) mGravity = event.values; if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) mGeomagnetic = event.values; 이어야합니다. if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) mGravity = event.values.clone(); if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) mGeomagnetic = event.values.clone(); 그렇지 않으면 "getRotationMatrix"메서드는 "false"를 자주 반환합니다. 하지만 왜 그런지 모르겠다. – user853007

+0

대단히 고마워요. 왜 내 머리를 긁적이 지난 몇 시간을 알아 내려고! 이것은 문제를 완벽하게 해결합니다. – KSdev

답변

1

문제는 다음 코드로 자리 잡고 있습니다 :

if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) mGravity = event.values; if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) mGeomagnetic = event.values; 

그것은해야한다 :

if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) mGravity = event.values.clone(); 
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) mGeomagnetic = event.values.clone(); 

이 그렇지 않으면 "getRotationMatrix"방법은 자주 "false"를 반환합니다. 하지만 왜 그런지 모르겠다.

0

고정 된 SensorEvents 풀이 있고 그 데이터를 직접 사용하는 경우 사용자가 직접 변경할 수 있지만 복제하면 언제든지 해당 데이터를 사용할 수 있습니다.