我使用getOrientation(R,I,gravity,magVals)来检测绕x轴的转动。现在我只想在屏幕上显示x值读数,但值总是为零,我不知道为什么。
编辑:经过一番调查后,我发现getRotationMatrix总是返回全零。加速度计和磁场参数虽然很好。我仍然不知道为什么。
编辑:我添加了ACCESS_COARSE_LOCATION和ACCESS_FINE_LOCATION权限,结果仍然相同。 请注意,我也经历了过去可以找到的解决getRotationMatrix问题的问题,但没有解决我的问题。我的实施方法:
1.添加加速度计和磁场监听器
2.每次发生加速度计/磁场事件时调用getRotationMatrix
3.将旋转矩阵传递给getOrientation调用(每当事件发生时也调用)
以下是处理方向的片段中onCreateView的一部分:
TextView xRotation = new TextView(rootView.getContext());
//Magnetic Sensor
Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
SensorEventListener magneticSel = new OtherSensorEventListener (xRotation);
sensorManager.registerListener(magneticSel, magneticSensor, SensorManager.SENSOR_DELAY_NORMAL);
//Accelerometer
Sensor accelSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
SensorEventListener accelSel = new OtherSensorEventListener(xRotation);
sensorManager.registerListener(accelSel, accelSensor, SensorManager.SENSOR_DELAY_NORMAL);
layout.addView(xRotation);
layout.setOrientation(LinearLayout.VERTICAL);
return rootView;
这是OtherSensorEventListener()类:
public static class OtherSensorEventListener implements SensorEventListener {
float [] magVals = new float[3];
float [] accelVals = new float [3];
float [] RMatrix;
TextView output;
public OtherSensorEventListener(TextView output) {
this.output = output;
}
@Override
public void onSensorChanged(SensorEvent event) {
switch(event.sensor.getType()) {
case Sensor.TYPE_MAGNETIC_FIELD:
magVals = event.values.clone();
break;
case Sensor.TYPE_ACCELEROMETER:
accelVals = event.values.clone();
break;
default:
break;
}
if (accelVals != null && magVals != null) {
RMatrix = new float[16];
SensorManager.getRotationMatrix(RMatrix, null, accelVals, magVals);
SensorManager.getOrientation(RMatrix, orientation);
output.setText("X Rotation: " + orientation[1]);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
}
这是方向全局变量(在MainActivity中声明):
static float [] orientation = new float[3];
我是Android新手。我不知道是否有比getOrientation更好的方法来做到这一点,但我必须将它作为我实验室的一部分。注意:我没有要求你为我做我的实验室,我只需要帮助调试
答案 0 :(得分:0)
你传入了两个不同的听众
new OtherSensorEventListener (xRotation);
因此,参数accelVals
或magVals
中的任何一个始终为零数组,因此getOrientation
始终返回0
尝试
SensorEventListener sensorEventListener = new OtherSensorEventListener (xRotation);
sensorManager.registerListener(sensorEventListener, magneticSensor, SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(sensorEventListener, accelSensor, SensorManager.SENSOR_DELAY_NORMAL);