因此我需要知道基于Android的手机何时旋转x,y,z方向以进行基于倾斜的程序然后我使用了良好循环的代码,该代码使用磁力和加速度来找到定向检测器以来的方向这是不可靠的,这在x,z平面上是好的,但是让我们说一个人在一个循环移动的公共汽车上将他们的手机固定在一个固定的风景位置,然后即使用户没有移动他们的手机,它也会注册y方向的移动在y方向,所以程序失败,但仅仅使用加速度也不准确,我想知道如何解决相对于用户检测y-运动的问题?
public class MotionListener {
String service_name = Context.SENSOR_SERVICE;
SensorManager sensorManager;
Sensor sensor;
public MotionListener(Context context) {
sensorManager = (SensorManager) context.getSystemService(service_name);
SensorManager sm = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
Sensor aSensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
Sensor mfSensor = sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
sm.registerListener(myAccelerometerListener, aSensor, SensorManager.SENSOR_DELAY_GAME);
sm.registerListener(myMagneticFieldListener, mfSensor, SensorManager.SENSOR_DELAY_GAME);
}
float[] accelerometerValues;
float[] magneticFieldValues;
final SensorEventListener myAccelerometerListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
accelerometerValues = sensorEvent.values;
float[] values = new float[3];
float[] R = new float[9];
try {
SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticFieldValues);
SensorManager.getOrientation(R, values);
values[0] = (float) ((float) values[0] * 180 / Math.PI);
values[1] = (float) ((float) values[1] * 180 / Math.PI);
values[2] = (float) ((float) values[2] * 180 / Math.PI);
System.out.println((int)values[0] + " " + (int)values[1] + " " + (int)values[2]);
setTiltCoordinates(values);
} catch (NullPointerException e) {
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
答案 0 :(得分:4)
好吧,如果您只是查看加速度计数据,您只需要在x,y和z方向上有三个值。其中一个将获得最大的吸引力,你通常可以将其视为“向下”的方向。
移动可能存在问题,例如用户是否在现场旋转,使手机感觉不是由于重力引起的加速度,如果这足够大,它可能会开始看起来方向“向下”,然而,你必须要足够快地旋转以产生接近1g的加速度,我非常怀疑公共汽车能够做到。
下一个大问题是,x,y和z数据值只是三个垂直轴,每个手机可以以不同方式定向。在一部手机上,'y'(通常被认为是上下轴)可能是通过屏幕,屏幕位于zx,平面上。另一部手机可能与屏幕成一定角度。
因此,从加速度计数据来看,您无法确定手机的方向。虽然,也许Android SDK可以解释这个问题并“调整”实际的加速计数据,以便所有手机都可以看到相同的数据。