API 31 获取设备方向:已废弃defaultDisplay.orientation的替代方案
替代废弃的defaultDisplay.orientation的方案
以下几种方案可以主动获取设备/屏幕方向,无需依赖仅在方向变化时触发的监听:
1. 通过Display.getRotation()结合屏幕尺寸判断屏幕显示方向
这个方法能准确获取当前屏幕相对于自然方向的旋转状态,结合屏幕宽高比可对应到原orientation的竖屏/横屏状态:
WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); Display display = windowManager.getDefaultDisplay(); int rotation = display.getRotation(); Point screenSize = new Point(); display.getSize(screenSize); int currentOrientation; // 自然方向或180度旋转,且屏幕高度大于宽度 → 竖屏 if ((rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) && screenSize.y > screenSize.x) { currentOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; } // 90或270度旋转,且屏幕宽度大于高度 → 横屏 else if ((rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) && screenSize.x > screenSize.y) { currentOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; } // 特殊情况(如方形屏幕、折叠屏) else { currentOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; }
2. 通过Configuration获取屏幕配置方向
直接从系统配置中读取当前的方向状态,注意如果应用锁定了屏幕方向,该值不会随设备物理姿态变化:
Configuration config = getResources().getConfiguration(); switch (config.orientation) { case Configuration.ORIENTATION_PORTRAIT: // 竖屏逻辑 break; case Configuration.ORIENTATION_LANDSCAPE: // 横屏逻辑 break; case Configuration.ORIENTATION_SQUARE: // 方形屏幕逻辑 break; }
3. 通过加速度传感器获取设备物理姿态方向
如果需要获取设备实际的物理摆放方向(不受屏幕锁定影响),可以单次读取加速度传感器数据计算:
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); if (accelerometer != null) { SensorEventListener singleListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { float x = event.values[0]; float z = event.values[2]; // 通过roll角度判断设备横/竖状态 float roll = (float) Math.atan2(-x, z) * 180 / Math.PI; if (Math.abs(roll) > 45 && Math.abs(roll) < 135) { // 设备处于横屏姿态 } else { // 设备处于竖屏姿态 } // 仅获取一次数据后立即注销监听 sensorManager.unregisterListener(this); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) {} }; sensorManager.registerListener(singleListener, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); }
内容的提问来源于stack exchange,提问作者zeeshan7799
相关产品推荐
相关产品推荐

