所以我需要知道基于Android的手机什么时候旋转x,y,z方向为基于倾斜的程序然后我使用流动良好的代码,利用磁力和加速度找到方向,因为方向检测器不可靠,这在x,z平面上是好的,但是让我们说一个人在一个循环移动的公共汽车上将他们的手机固定在一个固定的风景位置,然后Android注册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) {
}
};
最佳答案
好吧,如果您只是查看加速度计数据,那么您只需要在x,y和z方向上有三个值.其中一个将获得最大的吸引力,你通常可以将其视为“向下”的方向.
原文链接:https://www.f2er.com/android/430571.html移动可能存在问题,例如,如果用户在现场旋转,使手机感觉不是由于重力引起的加速,如果这足够大,它可能会开始看起来方向“向下”,但是,你必须要足够快地旋转以产生接近1g的加速度,我非常怀疑公共汽车能够做到这一点.
您接下来的一个大问题是,x,y和z数据值只是三个垂直轴,每个手机可以以不同方式定向.在一部手机上,’y'(通常被认为是上下轴)可能是通过屏幕,屏幕位于zx,平面上.另一部手机可能与屏幕成一定角度.
因此,从加速度计数据来看,您无法分辨出手机的方向.虽然,也许Android SDK可以解释这个问题并“调整”实际的加速度计数据,以允许所有手机看到相同的数据.