나는 코드를 다음과 같이 구현 :안드로이드 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
어떤 도움이 많이 받고있다.
문제는 다음과 같은 코드가있다 : 경우 ((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
대단히 고마워요. 왜 내 머리를 긁적이 지난 몇 시간을 알아 내려고! 이것은 문제를 완벽하게 해결합니다. – KSdev