How to detect my screen orientation in portrait locked screen in android?

前端 未结 3 1883
刺人心
刺人心 2020-12-03 11:50

I want to find the camera screen orientation in locked portrait orientation mode, well I am using camera in my fragment class and I have already set my screen orientation as

相关标签:
3条回答
  • 2020-12-03 12:26

    You can use OrientationEventListener for this. this is class that customise it.

    public abstract class SimpleOrientationListener extends OrientationEventListener {
    
            public static final int CONFIGURATION_ORIENTATION_UNDEFINED = Configuration.ORIENTATION_UNDEFINED;
            private volatile int defaultScreenOrientation = CONFIGURATION_ORIENTATION_UNDEFINED;
            public int prevOrientation = OrientationEventListener.ORIENTATION_UNKNOWN;
            private Context ctx;
            private ReentrantLock lock = new ReentrantLock(true);
    
            public SimpleOrientationListener(Context context) {
                super(context);
                ctx = context;
            }
    
            public SimpleOrientationListener(Context context, int rate) {
                super(context, rate);
                ctx = context;
            }
    
            @Override
            public void onOrientationChanged(final int orientation) {
                int currentOrientation = OrientationEventListener.ORIENTATION_UNKNOWN;
                if (orientation >= 330 || orientation < 30) {
                    currentOrientation = Surface.ROTATION_0;
                } else if (orientation >= 60 && orientation < 120) {
                    currentOrientation = Surface.ROTATION_90;
                } else if (orientation >= 150 && orientation < 210) {
                    currentOrientation = Surface.ROTATION_180;
                } else if (orientation >= 240 && orientation < 300) {
                    currentOrientation = Surface.ROTATION_270;
                }
    
                if (prevOrientation != currentOrientation && orientation != OrientationEventListener.ORIENTATION_UNKNOWN) {
                    prevOrientation = currentOrientation;
                    if (currentOrientation != OrientationEventListener.ORIENTATION_UNKNOWN)
                        reportOrientationChanged(currentOrientation);
                }
    
            }
    
            private void reportOrientationChanged(final int currentOrientation) {
    
                int defaultOrientation = getDeviceDefaultOrientation();
                int orthogonalOrientation = defaultOrientation == Configuration.ORIENTATION_LANDSCAPE ? Configuration.ORIENTATION_PORTRAIT
                        : Configuration.ORIENTATION_LANDSCAPE;
    
                int toReportOrientation;
    
                if (currentOrientation == Surface.ROTATION_0 || currentOrientation == Surface.ROTATION_180)
                    toReportOrientation = defaultOrientation;
                else
                    toReportOrientation = orthogonalOrientation;
    
                onSimpleOrientationChanged(toReportOrientation);
            }
    
            /**
             * Must determine what is default device orientation (some tablets can have default landscape). Must be initialized when device orientation is defined.
             *
             * @return value of {@link Configuration#ORIENTATION_LANDSCAPE} or {@link Configuration#ORIENTATION_PORTRAIT}
             */
            private int getDeviceDefaultOrientation() {
                if (defaultScreenOrientation == CONFIGURATION_ORIENTATION_UNDEFINED) {
                    lock.lock();
                    defaultScreenOrientation = initDeviceDefaultOrientation(ctx);
                    lock.unlock();
                }
                return defaultScreenOrientation;
            }
    
            /**
             * Provides device default orientation
             *
             * @return value of {@link Configuration#ORIENTATION_LANDSCAPE} or {@link Configuration#ORIENTATION_PORTRAIT}
             */
            private int initDeviceDefaultOrientation(Context context) {
    
                WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
                Configuration config = context.getResources().getConfiguration();
                int rotation = windowManager.getDefaultDisplay().getRotation();
    
                boolean isLand = config.orientation == Configuration.ORIENTATION_LANDSCAPE;
                boolean isDefaultAxis = rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180;
    
                int result = CONFIGURATION_ORIENTATION_UNDEFINED;
                if ((isDefaultAxis && isLand) || (!isDefaultAxis && !isLand)) {
                    result = Configuration.ORIENTATION_LANDSCAPE;
                } else {
                    result = Configuration.ORIENTATION_PORTRAIT;
                }
                return result;
            }
    
            /**
             * Fires when orientation changes from landscape to portrait and vice versa.
             *
             * @param orientation value of {@link Configuration#ORIENTATION_LANDSCAPE} or {@link Configuration#ORIENTATION_PORTRAIT}
             */
            public abstract void onSimpleOrientationChanged(int orientation);
    
        }
    

    Then where you want to detect orientation just call

    SimpleOrientationListener mOrientationListener = new SimpleOrientationListener(
                    context) {
    
                @Override
                public void onSimpleOrientationChanged(int orientation) {
                    if(orientation == Configuration.ORIENTATION_LANDSCAPE){
    
                    }else if(orientation == Configuration.ORIENTATION_PORTRAIT){
    
                    }
                }
            };
            mOrientationListener.enable();
    
    0 讨论(0)
  • 2020-12-03 12:28

    You can achieve the orientation change value, when your activity set to only Portrait or Landscape specific and you want to perform some action when orientation changes.

    private OrientationEventListener orientationEventListener;
    

    initialize this variable in your class and implement it's listener in onCreate

    orientationEventListener = new OrientationEventListener(this) {
            @Override
            public void onOrientationChanged(int orientation) {
    
                Log.d("Orientation", orientation + " - " + currentOrientation);
    
                if (orientation >= 330 || orientation < 30) {
                    currentOrientation = Surface.ROTATION_0;
    
                } else if (orientation >= 60 && orientation < 120) {
                    currentOrientation = Surface.ROTATION_90;
    
                } else if (orientation >= 150 && orientation < 210) {
                    currentOrientation = Surface.ROTATION_180;
    
                } else if (orientation >= 240 && orientation < 300) {
                    currentOrientation = Surface.ROTATION_270;
    
                }
            }
        };
    

    currentOrentation is integer value for later use in the activity other units.

    0 讨论(0)
  • 2020-12-03 12:37

    You gonna have to use:

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    
    
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
    
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            //do your stuff with the button
        }
    }
    

    If you want your activity not to be recreated during orientation then use

    android:configChanges="orientation|keyboardHidden|screenSize"

    If you want your activity to be forced to stay portrait then you gonna have to use

    in your manifest file in the activity you would like just try android:screenOrientation="portrait"

    Hope it helps!!!

    0 讨论(0)
提交回复
热议问题