【发布时间】:2015-03-10 02:11:34
【问题描述】:
我正在使用 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 更好的方法来做到这一点,但我必须将它用作我实验室的一部分。注意:我不是要你帮我做我的实验,我只是需要调试方面的帮助
【问题讨论】:
标签: java android android-sensors