Cómo detectar la orientación de la pantalla en la pantalla bloqueada retrato en android?

Quiero encontrar la orientación de la pantalla de la cámara en el modo de orientación vertical bloqueado, así que estoy usando la cámara en mi clase de fragmento y ya he establecido mi orientación de la pantalla como retrato, pero el problema que estoy enfrentando es, cuando vuelvo mi cámara de retrato a Paisaje de su cambio y tengo que configurar el botón de captura visible sólo cuando la cámara está en modo retrato. ¿Puede alguien ayudarme a obtener los cambios de orientación en el modo retrato? A continuación se muestra mi código:

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 } 

Puede utilizar OrientationEventListener para esto. Esta es la clase que lo personalizan.

 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); } 

A continuación, donde desea detectar la orientación sólo llamada

 SimpleOrientationListener mOrientationListener = new SimpleOrientationListener( context) { @Override public void onSimpleOrientationChanged(int orientation) { if(orientation == Configuration.ORIENTATION_LANDSCAPE){ }else if(orientation == Configuration.ORIENTATION_PORTRAIT){ } } }; mOrientationListener.enable(); 

Vas a tener que usar:

 @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 } } 

Si desea que su actividad no se recrea durante la orientación, utilice

android:configChanges="orientation|keyboardHidden|screenSize"

Si quieres que tu actividad se vea forzada a permanecer retrato, entonces tendrás que usar

En tu archivo de manifiesto en la actividad que te gustaría probar con android:screenOrientation="portrait"

¡¡¡Espero eso ayude!!!

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.