Android方向检测肤色

com*_*lla 5 android

所以我需要知道基于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) {
            }
        };
Run Code Online (Sandbox Code Playgroud)

the*_*man 4

好吧,如果您只是查看加速度计数据,您所拥有的只是 x、y 和 z 方向的三个值。其中一个具有最大的拉力,您通常可以将其理解为“向下”的方向。

移动可能会出现问题,例如,如果用户在原地旋转,使手机感受到非重力引起的加速度,如果这足够大,它可能会开始看起来方向是“向下”,但是,你必须旋转得足够快才能产生接近一克的加速度,我非常怀疑公共汽车是否能够做到这一点。

下一个大问题是,x、y 和 z 数据值只是三个垂直轴,每个手机的方向可能不同。在一部手机上,“y”(通常被认为是上下轴)可能穿过屏幕,而屏幕位于 zx 平面上。另一部手机的 y 可能与屏幕成一定角度。

因此,仅根据加速度计数据,您无法判断手机的方向。不过,也许 Android SDK 会考虑到这一点并“调整”真实的加速计数据,以允许所有手机看到相同的数据。