如何在android中的肖像locking屏幕中检测我的屏幕方向?

我想在locking的人像定位模式下find相机的屏幕方向,以及我在片段类中使用相机,我已经将屏幕方向设置为肖像,但是我面对的问题是,当我将相机从肖像转换为风景变得更改,只有当相机处于肖像模式时,我才需要设置捕捉button。 任何人都可以帮助我获得肖像模式的方向变化? 以下是我的代码:

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 } 

Solutions Collecting From Web of "如何在android中的肖像locking屏幕中检测我的屏幕方向?"

你可以使用OrientationEventListener来做到这一点。 这是定制它的类。

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

然后在你想要检测方位的地方打电话

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

你将不得不使用:

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

如果您希望在定位期间不要重新创build活动,请使用

android:configChanges="orientation|keyboardHidden|screenSize"

如果你想要你的活动被迫保持肖像,那么你将不得不使用

在你的manifest文件中你只想试试android:screenOrientation="portrait"

希望能帮助到你!!!