Как получить угол / градус телефона с сенсором / с?

Я пытаюсь определить угол обзора телефона с помощью датчика TYPE_ACCELEROMETER. Моя цель - получить значения углов только после того, как телефон наклонен. Это работает, но проблема в том, что когда я кладу телефон на стол, он по-прежнему говорит: isLandscape = true;

private boolean isLandscape;

mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(
                                          Sensor.TYPE_ACCELEROMETER),1000000);
private final SensorEventListener mSensorListener = new SensorEventListener() { 
    @Override
    public void onSensorChanged(SensorEvent mSensorEvent) {  
        float X_Axis = mSensorEvent.values[0];
        float Y_Axis = mSensorEvent.values[1];
        double angle = Math.atan2(X_Axis, Y_Axis)/(Math.PI/180);

        if(!isLandscape) {                  
            if(angle > 80) {
                Orientation = 90;
                isLandscape = true;
            }
        }
        else 
        {

            if(Math.abs(angle) < 10) {
                Orientation = 0;  //portrait
                isLandscape = false;
            }
        }
    }

    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
};

Какой лучший способ получить телефонные углы только после того, как телефон наклонен? Извините за плохой английский,

Спасибо.

2 ответа

Решение

Я не знаю, понимаю ли я ваш вопрос, но я думаю, что вы хотите, чтобы ваше приложение вычисляло ангела наклона, только если телефон находится в портретном режиме, сначала вы должны принять значение mSensorEvent.values[0] и в этом случае, если телефон в состоянии ожидания вернется 0, наклон вправо будет отрицательным значением от 1 до 9, а слева положительным.

тогда вы должны сделать все это на случай mSensorEvent.values[1] например, значения от 9 до 7 (9 - идеальный стенд) . обеспечить устройство в портретном положении.

и если вам нужны значения угла в градусах, вы можете умножить значение с плавающей точкой mSensorEvent.values на 10

я надеюсь, что это поможет вам

ОБНОВИТЬ***

Вы можете попробовать это:

    private boolean isLandscape;

    @Override 
    public void onSensorChanged(SensorEvent mSensorEvent) {   
        float X_Axis = mSensorEvent.values[0]; 
        float Y_Axis = mSensorEvent.values[1]; 

        if((X_Axis <= 6 && X_Axis >= -6) && Y_Axis > 5){
        isLandscape = false; 
        }
        else if(X_Axis >= 6 || X_Axis <= -6){
        isLandscape = true;
        }

    } 

Вместо регистрации ACCELEROMETER датчик, просто есть ученик типа OrientationEventListener, Когда устройство плоское, вы должны получить OrientationEventListener.ORIENTATION_UNKNOWN,

См. Android-пейзаж вправо, чтобы ландшафт левое событие, как создать OrientationEventListener член класса.

Или вы можете оставить свой код как есть, но также проверить наклон устройства. Если устройство плоское, установите isLandscape Отметьте все, что подходит для вашего случая. О том, как рассчитать наклон устройства, см. Как измерить наклон телефона в плоскости XY с помощью акселерометра в Android

Другие вопросы по тегам