Search code examples
androidscreen-orientationsensormanager

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


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 portrait, but the problem I am facing is, when I turn my camera from portrait to landscape its getting changed and I need to set capture button visible only when the camera is in portrait mode. Can anyone help me to get the orientation changes in portrait mode? Below is my code:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

sensorManager.registerListener(new SensorEventListener() {

    int orientation=-1;;

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.values[1] < 6.5 && event.values[1] > -6.5) {
            if (orientation!=1) {
                Log.d("Sensor", "Landscape");
            }
            orientation = 1;
        } else {
            if (orientation!=0) {
                Log.d("Sensor", "Portrait");
            }
            orientation = 0;
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
}, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);

if (orientation == 0) {
    // capture button visisble
} else {
    // invisible
}

Solution

  • 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();