Заранее спасибо всем, кто может помочь разобраться в этом.
Я новичок в Android Разработчик и создал приложение Compass, которое поможет определять курс в градусах с помощью датчиков устройства. Компас возвращает правильное значение, когда само устройство вращается (пока оно неподвижно), но когда оно установлено в транспортном средстве, значения вращения остаются неизменными. Я проверил другие реализации приложения Compass и, похоже, я ничего не пропустил.
Любое понимание того, в чем может быть проблема?
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private SensorManager mySensorManager;
private float[] accelVals = new float[3];
private float[] magVals = new float[3];
private float[] rotationMatrix = new float[16];
private float[] orientationVals = new float[3];
int Pose;
TextView displayData2;
Sensor myMagneticSensor, myAccelerometer;
// System display. Need this for determining rotation.
private Display mDisplay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
displayData2 = (TextView) findViewById(R.id.data2);
mySensorManager = (SensorManager) getSystemService(
Context.SENSOR_SERVICE);
myAccelerometer = mySensorManager.getDefaultSensor(
Sensor.TYPE_ACCELEROMETER);
myMagneticSensor = mySensorManager.getDefaultSensor(
Sensor.TYPE_MAGNETIC_FIELD);
}
@Override
protected void onStart() {
super.onStart();
// Listeners for the sensors are registered in this callback and
// can be unregistered in onStop().
//
// Check to ensure sensors are available before registering listeners.
// Both listeners are registered with a "normal" amount of delay
// (SENSOR_DELAY_NORMAL).
if (myAccelerometer != null) {
mySensorManager.registerListener(this, myAccelerometer,
SensorManager.SENSOR_DELAY_NORMAL);
}
if (myMagneticSensor != null) {
mySensorManager.registerListener(this, myMagneticSensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
}
@Override
protected void onStop() {
super.onStop();
// Unregister all sensor listeners in this callback so they don't
// continue to use resources when the app is stopped.
mySensorManager.unregisterListener(this);
}
@Override
public void onSensorChanged(SensorEvent event) {
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER: {
accelVals = event.values.clone();
break;
}
case Sensor.TYPE_MAGNETIC_FIELD: {
magVals = event.values.clone();
break;
}
}
SensorManager.getRotationMatrix(rotationMatrix, null, accelVals,
magVals);
SensorManager.getOrientation(rotationMatrix, orientationVals);
// Convert the result from radians to degrees
orientationVals[0] = (float) Math.toDegrees(orientationVals[0]);
orientationVals[1] = (float) Math.toDegrees(orientationVals[1]);
orientationVals[2] = (float) (Math.toDegrees(orientationVals[2]) + 360) % 360 ;
Pose = Math.round(orientationVals[2]);
//Print Data
displayData2.setText("Pose: " + Pose);
// displayData2.setText("Z: " + Float.toString(orientationVals[2]));
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}