0

Моя деятельность заблокирована на LANDSCAPE. Но все же мне нужно знать ориентацию устройства. Поэтому я решил использовать датчики. У меня есть следующий кодКак определить ориентацию устройства с датчиков

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL); 
... 
@Override 
    public void onSensorChanged(SensorEvent event) { 
    float[] values = event.values; 

    // Movement 
    float azimuth = values[0]; 
    float pitch = values[1]; 
    float roll = values[2]; 

    if ((-110 <= pitch && pitch <= -70) || (70 <= pitch && pitch <= 110)) { 
     //PORTRAIT MODE 
     portraitPitch = true; 
     landscapePitch = false; 
     Log.d(TAG, "portrait mode: pitch = " + pitch); 
    } else if ((-20 <= pitch && pitch <= 20) || (-200 <= pitch && pitch <= -160) || (160 <= pitch && pitch <= 200)) { 
     //LANDSCAPE MODE 
     portraitPitch = false; 
     landscapePitch = true; 
     Log.d(TAG, "landscape mode : pitch = " + pitch); 
    } 

    if ((-20 <= roll && roll <= 20)) { 
     //PORTRAIT MODE 
     portraitRoll = true; 
     landscapePitch = false; 
     Log.d(TAG, "portrait mode: roll = " + roll); 
    } else if ((-110 <= roll && roll <= -70) || (70 <= roll && roll <= 110)) { 
     //LANDSCAPE MODE 
     portraitRoll = false; 
     landscapePitch = true; 
     Log.d(TAG, "landscape mode : roll = " + roll); 
    } 

    if (portraitPitch && portraitRoll && !portrait) { 
     portrait = true; 
     landscape = false; 
     rotateIconsToPortraitMode(); 
     Log.d(TAG, "portrait mode for icons: pitch = " + pitch + ", roll = " + roll); 
    } 

    if (landscapePitch && landscapeRoll && !landscape) { 
     landscape = true; 
     portrait = false; 
     rotateIconsToLandscapeMode(); 
     Log.d(TAG, "landscape mode for icons: pitch = " + pitch + ", roll = " + roll); 
    } 
} 

Мой код не работает надежно, на самом деле, otateIconsToLandscapeMode() никогда не достигается.

Как использовать информацию о azimuth, pitch и roll определить портретную или альбомную ориентацию устройства? ` Я надеюсь, что мой вопрос достаточно конкретен, чтобы гарантировать конкретный ответ. Благодарю.

+0

Вы пытались самостоятельно изменить конфигурацию? http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange - добавьте 'configChanges: orientation' для манифестации и реализуйте' onConfigurationChanged', тогда, возможно, вы можете получить 'newConfig.orientation' – wasyl

+0

Это не работает. Когда ориентация заблокирована, событие изменения конфигурации не имеет смысла. Вы должны использовать датчик. –

+0

Тогда я бы предложил http://stackoverflow.com/questions/27614439/how-to-detect-my-screen-orientation-in-portrait-locked-screen-in-android – wasyl

ответ

0

Если ориентация LANDSCAPE vs PORTRAIT - это все, что вам нужно, то значение высоты тона должно быть достаточным. Это может быть не идеально, в зависимости от ваших конкретных потребностей. Но, по моему мнению, вы можете просто использовать поле. Так вы это точно, как у вас есть, просто игнорируйте бросок.

1

В oncreate экземпляр OrientationEventListener

OrientationEventListener orientationEventListener = new OrientationEventListener(this) 
    { 
     @Override 
     public void onOrientationChanged(int orientation) 
     { 
      Log.d(TAG, "orientation = " + orientation); 
     } 
    }; 

    orientationEventListener.enable(); 

Используя значение ориентации можно определить, является ли устройство в в вертикальной или горизонтальной.

 Смежные вопросы

  • Нет связанных вопросов^_^