Определение ориентации устройства


Мне нужно обнаружить изменение ориентации устройства android, не играя вручную с данными датчиков, сохраняя при этом ориентацию активности на некоторую ориентацию

onConfigurationChange не будет работать, так как будет прилипать моя деятельность, чтобы не вращаться.

Играя с данными датчиков для обнаружения изменения ориентации я рассматриваю это как изобретение колеса, так как android уже имеет встроенную реализацию алгоритма для обнаружения изменения ориентации устройства. А с другой стороны обнаружение изменение ориентации-это не простая проверка, как эта.
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER || event.values.length < 3) {
            return;
        }
        //getResources().getConfiguration().orientation;
        if (event.values[1] < 6.5 && event.values[1] > -6.5) {
            if (orientation!=1) {
                Log.d("Sensor", "Protrait");
            }
            orientation=1;
        } else {
            if (orientation!=0) {
                Log.d("Sensor", "Landscape");
            }
            orientation=0;
        }
   }
Это действительно требует реальной обработки данных, такой как фильтрация от шума и внезапных коротких встряхиваний / вращений.

Итак, есть идеи, как можно определить ориентацию устройства с помощью устаревших сервисов ? (Еще раз, я буду придерживаться своей деятельности в некоторой ориентации, так что onConfigurationChange не будет работать)

3 5

3 ответа:

Моя активность всегда будет находиться в портретном режиме. Поставьте этот код onCreate.

    myOrientationEventListener = new OrientationEventListener(this,SensorManager.SENSOR_DELAY_NORMAL) {
        public void onOrientationChanged(int arg0) {
            if (arg0>=315 || arg0<45){
                currentOrientation = Surface.ROTATION_90;
            }else if (arg0>=45 && arg0<135){
                currentOrientation = Surface.ROTATION_180;
            }else if (arg0>=135 && arg0<225){
                currentOrientation = Surface.ROTATION_270;
            }else if (arg0>=225 && arg0<315){
                currentOrientation = Surface.ROTATION_0;
            }
        }
    };

Установив свойство screenOrientation в Манифесте, вы больше не сможете получить значение ориентации из onConfigurationChanged, так как оно перестанет срабатывать, можно реализовать SensorEventListener, чтобы получить Pitch, roll и yaw углы для вычисления ориентации, но это немного сложно и излишне для такой задачи. Лучшее решение, которое я нашел, это использовать OrientationEventListener, следующий код обновит значение поворота при изменении ориентации, значение от 0 до 4 в зависимости от угла поворота:

private OrientationEventListener listener;
private int rotation;

@Override
protected void onCreate (Bundle savedInstanceState)
{
    super.onCreate (savedInstanceState);
    setContentView (R.layout.main);

    listener = new OrientationEventListener (this, SensorManager.SENSOR_DELAY_NORMAL)
    {
        @Override
        public void onOrientationChanged (int orientation)
        {
            rotation = ((orientation + 45) / 90) % 4;
        }
    };

    if (myOrientationEventListener.canDetectOrientation()) listener.enable();
    else listener = null; // Orientation detection not supported
}

@Override
protected void onDestroy()
{
    super.onDestroy();
    if (listener != null) listener.disable();
}