三星Galaxy设备中Android orientation返回错误值问题求助
三星Galaxy设备屏幕方向检测异常的解决方法
这个问题我在开发者社区里见过不少人反馈,确实是三星One UI定制系统的一个常见小坑!很多使用三星S/Note/Z系列设备的开发者都碰到过activity.getResources().getConfiguration().orientation始终返回ORIENTATION_PORTRAIT(值为1)的情况,哪怕设备明明处于横屏状态。
为什么会出现这个问题?
三星的One UI对系统Configuration做了一些定制化修改,比如在多窗口模式、折叠屏场景,或者用户开启了某些系统方向锁定选项时,getResources()拿到的Configuration对象可能不会实时同步真实的屏幕旋转状态,导致方向判断出错。
替代的屏幕方向检测方法
推荐直接从系统的WindowManager获取真实的屏幕旋转角度,这个方法不受三星系统定制的影响,准确性更高:
// 在Activity或Fragment中获取 WindowManager windowManager = (WindowManager) requireContext().getSystemService(Context.WINDOW_SERVICE); Display display = windowManager.getDefaultDisplay(); int rotation = display.getRotation(); int realOrientation; switch (rotation) { case Surface.ROTATION_0: case Surface.ROTATION_180: // 竖屏(正竖/倒竖) realOrientation = Configuration.ORIENTATION_PORTRAIT; break; case Surface.ROTATION_90: case Surface.ROTATION_270: // 横屏(左横/右横) realOrientation = Configuration.ORIENTATION_LANDSCAPE; break; default: realOrientation = Configuration.ORIENTATION_UNDEFINED; }
如果你的项目需要兼容API 17及以下版本,也可以用已弃用的getOrientation()方法(但更推荐上面的getRotation()方案):
int orientation = getWindowManager().getDefaultDisplay().getOrientation();
额外的注意事项
- 如果是在Fragment中处理布局切换,确保宿主Activity已经在Manifest中声明了
android:configChanges="orientation|screenSize|smallestScreenSize",避免系统重启Activity导致状态丢失。 - 在
onConfigurationChanged()回调中,不要直接使用传入的newConfig.orientation,而是用上面的WindowManager方法获取真实方向后再更新布局。
内容的提问来源于stack exchange,提问作者Lalit Agarwal
相关产品推荐
相关产品推荐

