Android Java 固定screenOrientation时如何获取设备实际旋转信息
解决固定竖屏后获取真实设备朝向的方案
由于你在AndroidManifest.xml中为Activity配置了
android:screenOrientation="sensorPortrait"锁定了页面显示方向,WindowManager.getDefaultDisplay().getRotation()只能返回Activity当前的渲染方向,和设备物理朝向无关,无法满足需求。
你可以使用OrientationEventListener监听传感器返回的设备物理姿态,不受页面方向锁定的影响,实现代码如下:
// 全局变量声明 private OrientationEventListener orientationListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); // 初始化方向监听器,第二个参数为传感器采样率,默认用SENSOR_DELAY_NORMAL即可 orientationListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL) { @Override public void onOrientationChanged(int orientation) { // 设备朝向未知时直接返回 if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) { return; } int deviceRealOrientation; // 根据角度判断设备真实朝向,可根据业务调整角度容错范围 if (orientation > 350 || orientation < 10) { // 0°:设备顶部朝上,正常竖屏 deviceRealOrientation = Surface.ROTATION_0; } else if (orientation > 80 && orientation < 100) { // 90°:设备左侧朝上,横向 deviceRealOrientation = Surface.ROTATION_90; } else if (orientation > 170 && orientation < 190) { // 180°:设备底部朝上,反向竖屏 deviceRealOrientation = Surface.ROTATION_180; } else if (orientation > 260 && orientation < 280) { // 270°:设备右侧朝上,横向 deviceRealOrientation = Surface.ROTATION_270; } else { // 中间过渡角度,不需要处理可直接返回 return; } // 此处deviceRealOrientation即为设备真实朝向,不受页面锁定影响 // 如需判断是否横屏,只要判断deviceRealOrientation为ROTATION_90或ROTATION_270即可 } }; // 设备支持方向检测则启动监听 if (orientationListener.canDetectOrientation()) { orientationListener.enable(); } } @Override protected void onDestroy() { super.onDestroy(); // 页面销毁时关闭监听,避免内存泄漏 if (orientationListener != null) { orientationListener.disable(); } }
注意事项
- 不需要额外申请任何权限,系统传感器服务会自动处理权限问题
- 角度判断的容错阈值可以根据业务需求自行调整
- 返回的朝向枚举和原来
getRotation()方法的返回值完全一致,不需要额外适配转换
内容的提问来源于stack exchange,提问作者jun
相关产品推荐
相关产品推荐

