У меня были проблемы с этим для слишком долго. Этот код должен произвести дуплекс, dy, дюжину для акселерометра и рабочее общее количество дуплекса. Это должно также произвести азимут, подачу и список.
Я использовал информацию, данную здесь, но напрасно.
Этот код правильно не производит подачу, азимут или список. Это производит 0.0,-0.0,-0.0 для последних трех textviews, соответственно.
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
accelerometerValues = event.values.clone();
case Sensor.TYPE_MAGNETIC_FIELD:
geomagneticMatrix = event.values.clone();
sensorReady = true;
break;
default:
break;
}
if (geomagneticMatrix != null && accelerometerValues != null && sensorReady) {
sensorReady = false;
float[] R = new float[16];
float[] I = new float[16];
SensorManager.getRotationMatrix(R, I, accelerometerValues, geomagneticMatrix);
float[] actual_orientation = new float[3];
SensorManager.getOrientation(R, actual_orientation);
tvXCoordinate.setText(accelerometerValues[0] + "");
tvYCoordinate.setText(accelerometerValues[1] + "");
tvZCoordinate.setText(accelerometerValues[2] + "");
floatXTotal += accelerometerValues[0];
tvXTotal.setText(floatXTotal + "");
tvAzimuth.setText(actual_orientation[0] + "");
tvPitch.setText(actual_orientation[1] + "");
tvRoll.setText(actual_orientation[2] + "");
}
Возможно, мне что-то не хватает (и вы, возможно, уже решили эту проблему), но мне кажется, что ваш оператор switch неверен:
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
accelerometerValues = event.values.clone();
case Sensor.TYPE_MAGNETIC_FIELD:
geomagneticMatrix = event.values.clone();
sensorReady = true;
break;
default:
break;
}
Если событие вашего датчика - TYPE_ACCELEROMETER
значения из события будут клонированы как в акселерометрValues
, так и в geom MagneticMatrix
и sensorReady
будут установлены в значение true. Я думаю, вам может потребоваться изменить порядок этого блока или, возможно, добавить разрыв ;
после вашего первого случая.