Android 30+设备旋转后屏幕分辨率API返回值异常问题
Android 30+ 旋转后屏幕尺寸获取异常问题解答
1. 有没有其他人碰到过?
有不少开发者反馈过这个问题,主要集中在Android 11(API 30)及以上版本,属于比较典型的系统层面状态同步异常问题。
2. 是预期行为还是已知Bug?
这是已知系统Bug,不是预期行为。Android 11开始重构了窗口管理逻辑,部分场景下系统没能正确同步Display的旋转状态和窗口Metrics,导致getRotation()一直返回0,所有依赖这个状态的尺寸API自然也同步出错。
3. 会不会是应用自己的问题?
有可能,先排查这几个点:
- 是不是复用了旧的WindowManager实例:如果你的
windowManagerInstance是启动时初始化的,旋转后没重新获取,持有的就是旧状态的实例,自然拿不到新尺寸。 - 有没有配置
configChanges:如果Manifest里加了android:configChanges="orientation|screenSize",但没在onConfigurationChanged里更新相关逻辑,也可能导致状态滞后。 - 是不是在多窗口/悬浮窗场景下测试:这类场景下WindowManager的状态更新逻辑更复杂,更容易出问题。
修复方案
方案一:别存全局WindowManager实例
每次获取尺寸时,直接从当前Context拿最新的WindowManager,别复用全局变量:
import android.content.Context; import android.os.Build; import android.util.DisplayMetrics; import android.view.Display; import android.view.WindowManager; import android.view.WindowMetrics; import androidx.annotation.NonNull; public class DisplayUtil { public static void getScreenDimensions(@NonNull Context context) { WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); if (windowManager == null) return; Display display = windowManager.getDefaultDisplay(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { WindowMetrics metrics = windowManager.getCurrentWindowMetrics(); int width = metrics.getBounds().width(); int height = metrics.getBounds().height(); // 处理获取到的宽高 } else { DisplayMetrics metrics = new DisplayMetrics(); display.getRealMetrics(metrics); int width = metrics.widthPixels; int height = metrics.heightPixels; // 处理获取到的宽高 } } }
方案二:监听配置变化
在Activity里重写onConfigurationChanged,旋转后主动重新获取尺寸:
@Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); // 旋转后立刻获取最新尺寸 DisplayUtil.getScreenDimensions(this); }
方案三:确保用最新API(Android 11+)
API 30+优先用getCurrentWindowMetrics(),但核心还是要每次拿最新的WindowManager实例——旧实例的状态不会自动同步系统旋转后的变化。
另外,display.getRotation()返回0的问题,本质就是用了旧的Display实例,只要从最新的WindowManager里获取Display,就能拿到正确的旋转状态。
内容的提问来源于stack exchange,提问作者Blasterdude8
相关产品推荐
相关产品推荐

