You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:10:30