2013-11-26 3 views
6

У меня есть следующий код.блокировка ориентации в android программно

Java

public void lockScreenOrientation() { 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 
} 

public void unlockScreenOrientation() { 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 
} 

Я называю эти функции из JavaScript. Управление вводит эти методы. Однако ориентация не заблокирована.

Я попытался следующий для блокировки от ориентации

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 

Ни один из них, кажется, работает. Любые указатели были бы полезны.

+0

Вы попробовали 'setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); 'и' setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); '? –

+0

Какой режим ориентации вам нужен? – GrIsHu

+0

Я хочу заблокировать ориентацию. Если это пейзаж, я хочу заблокировать его до пейзажа, и если это портрет, я хочу зафиксировать его на портрете. Оба не работают. Поэтому я пытаюсь зафиксировать ориентацию ландшафта для целей тестирования. – user2682527

ответ

5

Я создал несколько полезных методов, которые помогут справиться с блокировкой ориентации, не стесняйтесь использовать этот класс.

Пример использования:

  • В деятельности: OrientationUtils.lockOrientationPortrait(MyActivityName.this)
  • В фрагменте: OrientationUtils.lockOrientationLandscape(getActivity())

Код:

/** Static methods related to device orientation. */ 
public class OrientationUtils { 
    private OrientationUtils() {} 

    /** Locks the device window in landscape mode. */ 
    public static void lockOrientationLandscape(Activity activity) { 
     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    } 

    /** Locks the device window in portrait mode. */ 
    public static void lockOrientationPortrait(Activity activity) { 
     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    } 

    /** Allows user to freely use portrait or landscape mode. */ 
    public static void unlockOrientation(Activity activity) { 
     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
    } 

} 

Вот мой полный класс OrientationUtils на GitHub, что может можно использовать в любом приложении для Android: https://github.com/danialgoodwin/android-simply-advanced-helper/blob/master/SimplyAdvancedHelperLibrary/src/net/simplyadvanced/utils/OrientationUtils.java

1

Это класс, который я написал для управления блокировкой и разблокировкой ориентации экрана. Я вызываю toggleScreenOrientationLock(this, prefs, isChecked) из проверенного переключателя кнопки CHhangedListener и restoreScreenLock(this, prefs) из onCreate(). В обоих случаях this - это ваша деятельность, а prefs - объект SharedPrefences, используемый для сохранения информации о состоянии замка.

Сложная часть кода getScreenOrientation(), which I stole from and cleaned up from here. Я попытаюсь объяснить логику того, как это работает.

Когда мы устанавливаем ориентацию устройства с помощью setRequestedOrienation(), нам нужно знать, находится ли устройство в ландшафтном или портретном режиме, и нам нужно знать, имеет ли он обратную ориентацию (повернута на 180 градусов).

Использование getResources().getConfiguration().orientation ответит на вопрос, в какой ориентации мы находимся. Если бы мы могли повлиять на поворот устройства, мы могли бы определить, было ли оно повернуто на 180 градусов или нет. К сожалению, в зависимости от устройства ROTATE_0 может быть портретным или альбомным. Телефоны обычно отображают ROTATE_0 на портрете, а планшеты - на пейзаж.

Таким образом, решение, используемое здесь, заключается в использовании размеров экрана, чтобы определить, находится ли он в ландшафте или портрете. Если экран шире, чем высокий, то мы делаем вывод, что устройство находится в альбомной ориентации, и наоборот для портрета. Затем мы можем определить поворот, чтобы выяснить, изменилась ли ориентация или нет.

Например, если экран шире, чем высокий, то мы знаем, что мы находимся в ландшафтной ориентации. Если поворот равен 0 или 180 (в логике кода это равно! IsRotatedOrthogonally), то мы знаем, что 0 является LANDSCAPE, а 180 REVERSE_LANDSCAPE.

It has been noted elsewhere что это не будет работать на всех устройствах, так как ориентация на обратную ориентацию 90 или 270 является специфичной для устройства.Но это все еще, вероятно, лучшее, что вы собираетесь сделать; в худшем случае одна ориентация будет вращаться на 180 градусов, когда вы ее закроете, что, вероятно, произойдет, если попытаться заблокировать экран любым другим способом.

public class ScreenLocker { 
    final private static String ROTATION_LOCKED_KEY = "LockedOrientationVal"; 
    final private static String ROTATION_IS_LOCKED_KEY = "IsRotationLocked"; 
    final private static String ROTATION_SAVED_KEY = "SavedOrientationVal"; 

    public static int getScreenOrientation(Activity activity) { 
     final Display display = activity.getWindowManager().getDefaultDisplay(); 
     final int rotation = display.getRotation(); 

     Point size = new Point(); 
     display.getSize(size); 

     final boolean isWiderThanTall = size.x > size.y; 

     final boolean isRotatedOrthogonally = (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270); 
     int orientation; 

     if (isRotatedOrthogonally) { 
      if (isWiderThanTall) 
       orientation = (rotation == Surface.ROTATION_90) ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 
      else 
       orientation = (rotation == Surface.ROTATION_90) ? ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; // normal and reversed switched intended 
     } 
     else { 
      if (isWiderThanTall) 
       orientation = (rotation == Surface.ROTATION_0) ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 
      else 
       orientation = (rotation == Surface.ROTATION_0) ? ActivityInfo.SCREEN_ORIENTATION_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 
     } 

     return orientation; 
    } 

    public static void toggleScreenOrientationLock(Activity activity,SharedPreferences prefs, boolean lock) { 
     if(lock) 
      lockScreenOrientation(activity, prefs); 
     else 
      unlockScreenOrientation(activity, prefs); 
    } 


    // call this from your activity's onCreate() or onResume() 
    public static boolean restoreScreenLock(Activity activity, SharedPreferences prefs) { 
     final boolean isLocked = prefs.getBoolean(ROTATION_IS_LOCKED_KEY, false); 
     final int previousLockedOrientation = prefs.getInt(ROTATION_LOCKED_KEY, -999); 

     if(isLocked && previousLockedOrientation != -999) { 
      prefs.edit().putInt(ROTATION_SAVED_KEY, activity.getRequestedOrientation()).apply(); 
      activity.setRequestedOrientation(previousLockedOrientation); 
      return true; 
     } 
     return false; 
    } 

    private static void lockScreenOrientation(Activity activity, SharedPreferences prefs) { 
     final int currentOrientation = activity.getRequestedOrientation(); 
     final int lockOrientation = getScreenOrientation(activity); 

     // checking isCurrentlyLocked prevents the ROTATION_LOCKED_KEY and ROTATION_SAVED_KEY 
     // becoming identical, which results in the screen not being able to be unlocked. 
     final boolean isCurrentlyLocked = prefs.getBoolean(ROTATION_IS_LOCKED_KEY, false); 

     if(!isCurrentlyLocked) { 
      activity.setRequestedOrientation(lockOrientation); 
      prefs.edit() 
        .putInt(ROTATION_SAVED_KEY, currentOrientation) 
        .putInt(ROTATION_LOCKED_KEY, lockOrientation) 
        .putBoolean(ROTATION_IS_LOCKED_KEY, true) 
        .apply(); 
     } 
    } 

    private static void unlockScreenOrientation(Activity activity, SharedPreferences prefs) { 
     final int savedOrientation = prefs.getInt(ROTATION_SAVED_KEY, activity.getRequestedOrientation()); 
     activity.setRequestedOrientation(savedOrientation); 
     prefs.edit().putBoolean(ROTATION_IS_LOCKED_KEY, false).apply(); 
    } 
} 
4
Activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); 


блокирует экран (активность) в какой-либо ориентации это было.

Требуется уровень API> = 18

0

Вот еще одно простое решение, которое хорошо работает для меня.

private void orientationManager(boolean lock) 
{ 
    int currentOrientation = getResources().getConfiguration().orientation; 
    if(lock) 
    { 
     if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) 
     { 
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
     } 
     else 
     { 
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 
     } 
    } 
    else 
    { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
    } 
} 

мне нужно заблокировать orientationManager(true); текущую ориентацию экрана, когда были открыты диалоги и разблокировать orientationManager(false);, когда диалог был закрыт.

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